gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:27:38 25 4
gpt4 key购买 nike

我在从某些线程获取结果时遇到了麻烦。我解释了环境,我有一个带有按钮的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com