使用 java.util.conconcurrent 触发并忘记



如何使用java.util.concurrency实现"即发即弃"行为?我试过了:

ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
    Future<Boolean> future = executor.submit(task);
    future.get(timeout, timeoutUnit);
}

get()在完成之前一直阻塞。push()调用方对任务的结果不感兴趣。

不要称呼get() . submit()足以在Thread中启动Callable.您可以绕过Future并在准备好获得结果时调用其get()(如果有的话)。

爪哇多克州

提交值返回任务执行并返回未来 表示任务的挂起结果。未来的获取方法 将在成功完成后返回任务的结果。

如果您想立即阻止等待任务,您可以使用 表单结果的构造 = exec.submit(aCallable).get();

所以不要打电话给get().

如果你不得不忘记它,就不需要 future 对象,即不关心线程的未来。 :)

ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
   executor.submit(task);
}

或者如果您需要晚于以下时间使用 future:-

ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
   someCollection.add(executor.submit(task)); // use futures later
}

或者只是使用执行器执行并传递 Runnable,如果你根本不打算获得未来。

ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Runnable task) {
   executor.execute(task);
}

在异常的情况下,execute 将调用默认的异常处理程序,如果您在提交方法中没有掌握期货,则可能会丢失该处理程序。

最新更新