java - 在SWT环境中如何知道一个线程是否完成了它的任务?

标签 java multithreading swt

我在从某些线程获取结果时遇到了麻烦。 我解释了环境,我有一个带有按钮的 SWT shell。此按钮的监听器调用一个 Runnable,该 Runnable 在其 run() 内部调用一个实例化 N 个线程以执行某些操作的方法。问题是:当所有计算终止时,如何在屏幕上显示消息对话框或其他内容?我的代码是类似的

public void widgetSelected(SelectionEvent event) {
    Runnable t = new MyThread(params);
    executor.execute(t);
  }

在 MyThread 类中我有

public void run(){
   myMethod();
}

public void myMethod(){
   for(int i =0; i<queue.length; i++){
      Runnable thread = new AnotherThread();
      executor.execute(thread);
   }
   executor.shutdown();
   if(executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS){
     //here I know all thread of kind AnotherThread have finished
   }
}

因此,在按钮监听器的 widgetSelected 方法中,我想放置一些内容来提醒用户监听器调用的所有线程已成功终止。 有办法知道吗?如果我将awaitTermination 语句放入监听器中,shell 将变得不响应并卡住在屏幕上。 希望有人能帮助我。如果有不清楚的地方,请告诉我。 谢谢大家。

最佳答案

这是“直接的” - 但需要一些工作:您“简单地”必须增强您的 Runnables 以某种方式表明它们的进度。

换句话说:ExecutorService 接口(interface)不提供任何方法来计算已完成的计划“任务”数量。因此,如果您需要该信息,则必须将其“烘焙”到您的 Runnable 中。

一个想法:创建一个Map<Runnable, Integer>预先。键是 Runnable 对象,值可以代表一些进度信息。所有值都从 0 开始。然后将该映射传递给每个 Runnable - Runnable 只是在某些定义的时间点更新其值。可能是 10 步,也可能只是 4 步。一旦所有 map 值都达到 100,您就知道您已经完成了!这意味着您的主线程只是每隔一秒/分钟/...循环并检查 map 内容,当然:这个额外线程不应该是事件调度程序线程。您不想在执行此操作时停止您的 UI。

(当然:你应该使用 ConcurrentHashMap 来实现这个)。

长话短说:这些信息已经可用 - Runnable 中的代码知道它在做什么,对吧?!因此,您“只需”以某种方式让外部世界可以访问这些信息。有很多选择可以做到这一点;以上只是实现这一目标的一种方法。

关于java - 在SWT环境中如何知道一个线程是否完成了它的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223482/

相关文章:

c# - 套接字行为 - 乱序写入的数据

c# - ThreadLocal 是否清除为已完成线程创建的值?

java - 以编程方式滚动 NatTable

c# - 长继承层次

java - 在构造函数的逻辑出现之前将模拟注入(inject)类

java - 使用正则表达式捕获预期结果

java - SWT - 关闭不同类的对话框窗口

java - Ant 更好的方法 <sleep> 而不是跳过它

c++ - 线程安全传递运算符

java - WizardPage 与 WizardDialog