用java.util.concurrent点火并忘记

时间:2013-09-05 18:31:03

标签: java java.util.concurrent fire-and-forget

如何使用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()调用者对任务的结果不感兴趣。

2 个答案:

答案 0 :(得分:10)

请勿致电get()submit()足以启动Callable中的Thread。当您准备好获得结果时(如果有的话),您可以传递Future并调用其get()

Javadoc

  

提交值返回任务以执行并返回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);
}

//执行将在异常的情况下调用默认的异常处理程序,如果你在提交方法中没有得到期货,则可能会丢失。