4

如何使用 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()结果不感兴趣。

4

2 回答 2

13

不要打电话get()submit()足以启动Callablein a Thread。当您准备好获得结果时(如果有的话),您可以传递Future并调用它。get()

Javadoc状态_

提交一个返回值的任务以供执行,并返回一个表示该任务待处理结果的 Future。Future 的 get 方法将在成功完成后返回任务的结果。

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

所以不要打电话get()

于 2013-09-05T18:33:17.530 回答
3

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

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 中的执行并传递 Runnable,如果您根本不打算获得未来。

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Runnable task) {
   executor.execute(task);
}

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

于 2013-09-05T21:59:40.370 回答