Java:有没有办法给一个监听器添加一个Executor
?我有一个包含Future
s 的集合,我尝试对其进行监控,以更新一些 GUI 状态。目前,如果提交/完成的任务存在差异,我正在检查后台线程,但我是在一个while(true){}
块中执行此操作,我不喜欢这种方法。
问问题
1978 次
5 回答
2
您可以根据您的 GUI 工具包使用 SwingWorkers 或类似的类来在任务完成时获得通知。
于 2012-11-13T15:35:03.117 回答
1
使用 java.util.concurrent.ExecutorCompletionService 代替 Executor 提交任务。它有方法 take() 返回最近完成的任务。take()
启动将在循环中调用的附加线程(或 SwingWorker) ,并使用结果更新 GUI 状态。
于 2012-11-13T16:08:57.047 回答
1
不幸的是,没有办法做到这一点。
相反,请使用 Google 的ListenableFuture<V>
界面。
或者,使用具有更好异步支持的语言,例如 C# 和 TPL。
于 2012-11-13T15:11:48.633 回答
1
如果您想在任务完成时执行某些操作,请将其添加到任务本身。
public static <T> void addTask(Callable<T> tCall) {
executor.submit(new Runnable() {
public void run() {
T t = tCall.call();
// what you want done when the task completes.
process(t);
}
});
}
于 2012-11-13T15:12:20.053 回答
0
我做了类似于@Peter Lawrey 的回答。
我添加了一个侦听器作为可调用对象的成员变量,并在可调用对象返回其结果之前调用了该侦听器。
所以你有一个监听器接口:
@FunctionalInterface
public interface Listener<T> {
void notify(T result);
}
将其作为成员变量的 Callable:
public class CallbackCallable implements Callable<String>{
private Listener<String> listener;
@Override
public String call() throws Exception {
// do some stuff
if (listener != null)
listener.notify("result string");
return "result string";
}
public void setListener(Listener<String> listener) {
this.listener = listener;
}
}
在您的应用程序中,您传递了一个侦听器的实现,其中包含您想要对结果执行的操作:
public static void main(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
System.out.println("This is thread: " + Thread.currentThread().getName());
CallbackCallable myCallable = new CallbackCallable();
myCallable.setListener(r -> {
// process your callable result here
System.out.println("Got from Callable: " + r);
System.out.println("This is thread: " + Thread.currentThread().getName());
});
es.submit(myCallable);
}
您唯一需要记住的是,您的实现将在与 Callable 相同的线程上运行,您可以看到是否运行它:
This is thread: main
Got from Callable: result string
This is thread: pool-1-thread-1
于 2018-05-30T11:35:26.123 回答