如何使用java.util.concurrency实现“ fire and forget ”行为?我试过了:
ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
Future<Boolean> future = executor.submit(task);
future.get(timeout, timeoutUnit);
}
但是get()
阻止直到完成。 push()
调用者对任务的结果不感兴趣。
答案 0 :(得分:10)
请勿致电get()
。 submit()
足以启动Callable
中的Thread
。当您准备好获得结果时(如果有的话),您可以传递Future
并调用其get()
。
提交值返回任务以执行并返回Future 表示任务的待定结果。未来的获取方法 成功完成后将返回任务的结果。
如果您想立即阻止等待任务,您可以使用 结构形式为result = exec.submit(aCallable).get();
所以请不要致电get()
。
答案 1 :(得分:2)
如果你不得不忘记它就不需要未来的对象,即不关心线程的未来。 :)
ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
executor.submit(task);
}
或者如果您需要在以后的某个时间使用以后: -
ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Callable<Boolean> task) {
someCollection.add(executor.submit(task)); // use futures later
}
或者只是使用Executor中的execute并传递Runnable,如果你不打算完全了解未来。
ExecutorService executor = Executors.newSingleThreadExecutor();
public void push(Runnable task) {
executor.execute(task);
}
//执行将在异常的情况下调用默认的异常处理程序,如果你在提交方法中没有得到期货,则可能会丢失。