我的button事件中设置了一个线程池(ExecutorService)exec,向其中添加进(比如说10个相同类型)线程,每个线程有参数(CountDownLatch)cdl(利用其进行全部完成判断),然后ExecutorService关闭(shutdown,阻止新的线程加入线程池)。final ExecutorService exec_crawler = Executors.newFixedThreadPool(3);
final CountDownLatch cdl = new CountDownLatch(al.size());
for (String s : al) {
Runnable cosi = new Interface4GUI(cdl,s);
exec_crawler.execute(cosi);
}
exec_crawler.shutdown();display设置异步线程(asyncExec),新建了一个线程,run中运行cdl.await();(阻塞式等待cout减到0),然后向一个Text组件写入字符串。if (!display.isDisposed())
display.asyncExec((new Runnable() {
@Override
public void run() {
// 执行异步可更新swt组件内容的线程,但主界面一直阻塞知道本线程执行结束
try {
cdl.await();
textarea_com0_tab0.append("结束\n");
} catch (InterruptedException e) {
e.printStackTrace();
} } }));但是display.asyncExec(Runnable)需要主界面等待线程结束,否则主界面无法响应。
那应该如何判断线程池中的线程全部结束,然后更新swt界面中的组件呢。楼下讨论中可以包括改变线程池中的线程类的结构。