1

Java:有没有办法给一个监听器添加一个Executor?我有一个包含Futures 的集合,我尝试对其进行监控,以更新一些 GUI 状态。目前,如果提交/完成的任务存在差异,我正在检查后台线程,但我是在一个while(true){}块中执行此操作,我不喜欢这种方法。

4

5 回答 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 回答