我有SwingWorker如下:
public class MainWorker extends SwingWorker(Void, MyObject) {
:
:
}
Run Code Online (Sandbox Code Playgroud)
我Swing Worker从EDT 调用了上述内容:
MainWorker mainWorker = new MainWorker();
mainWorker.execute();
Run Code Online (Sandbox Code Playgroud)
现在,mainWorker创建一个MyTask类的10个实例,以便每个实例都在自己的线程上运行,以便更快地完成工作.
但问题是我想在任务运行时不时更新gui.我知道如果任务是由mainWorker自己执行的,我可以使用publish()和process()方法来更新gui.
但是由于任务是由与线程不同的Swingworker线程执行的,我如何从执行任务的线程生成的中间结果更新gui.
有什么区别:
//Some code, takes a bit of time to process
(new SomeJFrame()).setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
(new SomeJWindow()).start();//Start a new thread
}
});
Run Code Online (Sandbox Code Playgroud)
和:
class doGraphics extends SwingWorker<Void, Object> {
@Override
public Void doInBackground() {
//Some code, takes a bit of time to process
(new SomeJFrame()).setVisible(true);
return null;
}
@Override
protected void done() {
(new SomeJWindow()).start();//Start a new thread
}
}
(new doGraphics()).execute();
Run Code Online (Sandbox Code Playgroud)
哪种方法更好用?
在方法上使用synchronized关键字一次只允许一个线程执行该方法,但EDT可以同时处理将在该方法中运行的多个"事件".请参阅下面的示例代码以进行演示.单击测试按钮时,输出为:
0 before dialog, EDT=true
1 before dialog, EDT=true
(click OK button for 1 here)
1 after dialog, EDT=true
(click OK button for 0 here)
0 after dialog, EDT=true
Run Code Online (Sandbox Code Playgroud)
我正在寻找的方法是一次只允许一个EDT事件在test()方法中处于活动状态,这样输出就会是
0 before dialog, EDT=true
(click OK button for 0 here)
0 after dialog, EDT=true
1 before dialog, EDT=true
(click OK button for 1 here)
1 after dialog, EDT=true
Run Code Online (Sandbox Code Playgroud)
好像有人必须先解决这个问题.我认为可以在方法的开头编写某种锁定对象,或者包装方法,但是懒惰,宁愿不重新发明轮子.
我的测试用例:
package test1;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class EDTSyncTest extends javax.swing.JFrame {
private static final Object …Run Code Online (Sandbox Code Playgroud)