我正在学习 Callables 并决定制作一个非常简单的程序。问题是当我调用 getFutureTask(); 时线程被阻塞。
Thread.State:TIMED_WAITING(在对象监视器上)
您能否告诉我为什么会这样以及为什么当我在 futureTask.get(); 之前编写 futureTask.run() 时我的程序可以工作?
我确实了解 get() 方法等待并返回结果。但无法理解 run() 方法的作用。
我非常感谢您的回答!
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
FutureTask futureTask = getFutureTask(1);
System.out.println(futureTask.get());
}
public static FutureTask<Integer> getFutureTask(Integer i) {
return new FutureTask<Integer>(() -> i*45);
}
run vs get
run
实际上是方法开始执行的任务。它应该被称为不同的线程,例如通过ExecutorService
.
get
will 不触发执行,它只是等待任务完成,即直到run
完成了。这显然意味着你打电话run
以某种方式之前或来自不同的线程。
ExecutorService and CompletableFuture
FutureTask
实际上不应该由用户直接使用。它更多的是在幕后使用的类类型,以实现良好的异步 API。更具体地说,它是基本实现Future
,例如返回ExecutorService
当你用它生成任务时。
相反你应该看看ExecutorService
ExecutorService service = Executors.newCachedThreadPool();
...
Future<Integer> task = service.submit(() -> i * 45);
...
Integer result = task.get();
and CompletableFuture
CompletableFuture<Integer> task = CompletableFuture.supplyAsync(() -> i * 45);
...
Integer result = task.get();
一个易于使用的界面来生成异步任务。
CompletableFuture
它的优点是您还可以设置一个操作管道,一旦前一个操作完成,这些操作就会异步执行。例如:
CompletableFuture<Void> task = CompletableFuture.supplyAsync(Foo::readSomeFile)
.thenApplyAsync(Foo::validateData)
.thenApplyAsync(Foo::compressData)
.thenAcceptAsync(Foo::uploadData);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)