2011-10-17 35 views
1

SwingWorker可以让你在后台准备一些数据Thread然后在EDT中使用它。我正在寻找一个相反的工具:在EDT中准备数据,然后将其传递到背景ThreadJava是否有内置的“反转”SwingWorker

如果您好奇,该用例将JTable的状态保存到磁盘(列顺序,大小等)。我需要在EDT中与其模型交谈,但不想从此线程写入磁盘。

喜欢的东西:

void saveCurrentState(final Table table) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      TableColumns state = dumpState(table); 
      saveToDisk(table.getTableKey(), state); 
     } 
    }); 
} 

dumpState()需要在美国东部时间运行。不应该在EDT中运行saveToDisk()。整个事情是故意包装在invokeLater(),我不能用invokeAndWait()代替它。

+2

那个其他线程在做什么?如果它是一个新的线程,只需要给它的数据... –

回答

2

您可能正在寻找ExecutorService。使用Executors.newCachedThreadPool()或其他newXXX()方法获得一个,但是对于大多数用途应该是可以的。

这就是说,我相信这是你可以用SwingWorker做的事情。只需在事件处理程序中准备好您的数据,然后即可创建SwingWorker - 您已在美国东部时间。如果您需要从非EDT线程启动此操作,请使用SwingUtilities.invokeAndWait()准备数据,然后关闭另一个线程来完成写入操作(或者在开始使用的同一个非EDT线程中执行此操作。)

SwingWorkerExecutorService提供了相同的基本服务 - 将一些工作分解为后台线程,而无需明确管理其生命周期。 SwingWorker有一个方便的方法与EDT进行通信,而不需要使用invokeLater(),而ExecutorService支持期货作为与异步任务通信的更一般的(非Swing特定的)方式。因为你们两个都没问题,所以这是一个不容忽视的用例。

+0

谢谢,这是我最后的目的。现在,如果只有Java关闭...... :-) –

+0

按照JSR正在进行的速度,Java应该不迟于2020年关闭! – millimoose