我有一个使用javax.script运行脚本的java swing应用程序。该
脚本访问swing小部件并模拟用户操作,例如JButton.doClick()
。
某些窗口小部件操作会导致一个或多个Threads (SwingWorker)
启动,并且
我需要脚本等待所有Threads
完成。但脚本运行
在事件调度线程中,如果我这样做,例如,CountDownLatch
有一个
在await()
,FutureTask
和submit()
内get()
,get()
将停止
EDT和GUI挂起。没有停止EDT就无法让脚本等待。
这个问题的解决方法是什么?
由于
答案 0 :(得分:3)
在我最近的一个项目中,我遇到了类似的问题。我解决它的方法是让EDT创建(并运行)一个新的anonymous SwingWorker
,然后调用(并等待)我的线程:
public void methodCalledByEDT() {
new SwingWorker<Void, Void>() {
public Void doInBackground() {
// Execute threads and wait for them here
// using the method you described above
return Void;
}
public Void done() {
// Code to execute when threads have finished goes here
return Void;
}
}.execute()
}
这确保了EDT可以继续使用它的业务 - 这是匿名的SwingWorker被阻塞等待线程完成。
答案 1 :(得分:0)
使用java.lang.ThreadGroup
构造线程作为其ThreadGroup参数。然后,您可以使用ThreadGroup#activeCount()
来估计该组中有多少个线程。要等待线程全部完成,您可以使用while循环等待,直到该组的活动线程数为0,此时您执行代码。