Mil*_*Mil 7 java swing multithreading
我正在开发一个小应用程序,它将具有Swing GUI.App正在另一个线程中执行IO任务,当该线程完成GUI时,应该相应地更新以反映线程的操作结果.在(工作者,非GUI)中运行的类具有在构造函数中传递给它的对象,该对象将用于更新GUI,因此我不需要将GUI内容放在非GUI类中,而是传递对象以更新GUI那个班.据我所知,这里的形式阅读,(线程/摆动)更新(更改)Swing GUI的安全选项将是使用javax.swing.SwingUtilities.invokeLater()
,javax.swing.SwingUtilities.invokeLaterWait()
和/或javax.swing.SwingWorker()
基本上做同样的事情.
Swing的所有线程问题对我来说有点混乱,但我需要使用线程在GUI应用程序中做任何有意义的事情而不是在EDT中处理时挂起GUI,所以我现在感兴趣的是:
是否invokeLater
并且invokeLaterWait
喜欢向EDT发送消息并等待它完成处理该呼叫之前的消息时执行此操作?
从Swing线程安全方面是否正确,做这样的事情:
interface IUPDATEGUI {
public void update();
}
// in EDT/where I can access components directly
class UpdateJList implements IUPDATEGUI {
public void update() {
// update JList...
someJList.revalidate();
someJList.repain();
}
}
class FileOperations implements Runnable {
private IUPDATEGUI upObj;
List<File> result = new ArrayList<File>; // upObject is accessing this
public void FileOperations(IUPDATEGUI upObj) {
this.upObj = upObj;
}
private void someIOTask() {
// ...
// IO processing finished, result is in "result"
}
public void run() {
someIOTask();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
upObj.update(); // access result and update JList
}
}; );
}
}
Run Code Online (Sandbox Code Playgroud)如果这不正确那么应该怎么做?
如果可以的话,我宁愿使用invokeLater
而不是SwingWorker
在可能的情况下使用,因为我不需要改变我的整个类,而且它在某种程度上更加整洁/独特(比如在Win32应用程序中发送消息).
提前致谢.
使用invokeLater()
和invokeAndWait()
传递的Runnable参数到在EDT队列等待执行.因此invokeLater()
,当EDT能够处理请求时,调用将导致Runnable在EDT中执行.invokeAndWait()
只需等待(在调用线程中)直到执行此操作.
如果您想要执行在执行结束时或处于中间状态时通知EDT的后台任务,则使用SwingWorker是理想的选择.一个例子是将进程的当前进度传递给JProgressBar.
对于您的示例,似乎SwingWorker是一个更好的选择,但如果您不想过多地更改代码,那么invokeLater()
在完成该过程时调用就可以了.
归档时间: |
|
查看次数: |
10853 次 |
最近记录: |