用java.util.concurrent点火并忘记

Phi*_*ayo 1 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);
}
Run Code Online (Sandbox Code Playgroud)

但是get()阻止直到完成.该push()来电者是不感兴趣的任务的结果.

Sot*_*lis 10

不要打电话get().submit()足以开始CallableThread.当你准备好得到结果时,你可以传递Future并调用它get()(如果有的话).

的Javadoc状态

提交值返回任务以执行并返回表示任务的挂起结果的Future.Future的get方法将在成功完成后返回任务的结果.

如果您想立即阻止等待任务,可以使用结构形式为result = exec.submit(aCallable).get();

所以就是不要打电话get().


leo*_*ame 6

如果您必须忘记它,则不需要未来对象,即不关心线程的未来。:)

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
   executor.submit(task);
}
Run Code Online (Sandbox Code Playgroud)

或者如果您需要在以下时间之后使用 future:-

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
   someCollection.add(executor.submit(task)); // use futures later
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您根本不打算获得未来,则只需使用 Executor 中的执行并传递 Runnable 即可。

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Runnable task) {
   executor.execute(task);
}
Run Code Online (Sandbox Code Playgroud)

// 如果发生异常,执行将调用默认的异常处理程序,如果您在提交方法中没有获取 futures,则该异常处理程序可能会丢失。