线程池使用FutureTask get不阻塞
时间: 2023-07-23 19:59:42 浏览: 77
要使线程池中的`FutureTask`的`get()`方法不阻塞,你可以使用`isDone()`方法来检查任务是否已完成。`isDone()`方法会立即返回一个布尔值,指示任务是否已经完成。
以下是一个示例代码:
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
// 执行耗时操作
Thread.sleep(5000);
return "Task completed";
}
});
executor.execute(futureTask);
// 检查任务是否已完成
if (futureTask.isDone()) {
try {
String result = futureTask.get(); // 这里不会阻塞
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
} else {
System.out.println("Task is still running");
}
executor.shutdown();
```
在这个例子中,我们创建了一个线程池并提交了一个`FutureTask`任务。然后我们使用`isDone()`方法来检查任务是否已经完成。如果任务已经完成,我们可以安全地调用`get()`方法获取结果,而不会阻塞主线程。如果任务尚未完成,我们可以执行其他操作,而不必等待任务完成。
需要注意的是,`get()`方法会阻塞主线程直到任务完成,因此只有在确认任务已经完成的情况下才应该调用它。
阅读全文