如何使用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 将调用默认的异常处理程序,如果您在提交方法中没有掌握期货,则可能会丢失该处理程序。