等待结果的异步和同步有什么区别?
What is the difference between asynchronous with waiting for result and synchronous?
最近在java学习多线程和异步编程,觉得很迷茫。
明确我的问题:下面的代码是否等效?
如果没有,为什么?在我看来,在第一个片段中,while 循环将使原始线程保持忙碌(意味着阻塞?)。
如果是,如何正确使用异步?
//asynchronous programing
ExecutorService threadpool = Executors.newCachedThreadPool();
Future<Long> futureTask = threadpool.submit(() -> factorial(number));
while (!futureTask.isDone()) {
System.out.println("FutureTask is not finished yet...");
}
long result = futureTask.get();
threadpool.shutdown();
//synchronous
long result = factorial(number)
当要一个接一个地执行任务时,使用异步方法并没有太大的意义:你失去了同步的开销,而且还要等待处理结束。此外,如果您使用主动循环等待结束:
while (!futureTask.isDone()) { // active wait loop
System.out.println("FutureTask is not finished yet...");
}
您给系统增加了更多负载。至少你应该使用 wait
方法将当前线程置于挂起模式,直到其他处理完成。
不过不管怎样,任务要一个接一个执行,一个接一个同步调用即可:
factorial(number));
other processings...
它使代码更干净、更易于维护,并且没有性能损失。
最近在java学习多线程和异步编程,觉得很迷茫。
明确我的问题:下面的代码是否等效?
如果没有,为什么?在我看来,在第一个片段中,while 循环将使原始线程保持忙碌(意味着阻塞?)。
如果是,如何正确使用异步?
//asynchronous programing
ExecutorService threadpool = Executors.newCachedThreadPool();
Future<Long> futureTask = threadpool.submit(() -> factorial(number));
while (!futureTask.isDone()) {
System.out.println("FutureTask is not finished yet...");
}
long result = futureTask.get();
threadpool.shutdown();
//synchronous
long result = factorial(number)
当要一个接一个地执行任务时,使用异步方法并没有太大的意义:你失去了同步的开销,而且还要等待处理结束。此外,如果您使用主动循环等待结束:
while (!futureTask.isDone()) { // active wait loop
System.out.println("FutureTask is not finished yet...");
}
您给系统增加了更多负载。至少你应该使用 wait
方法将当前线程置于挂起模式,直到其他处理完成。
不过不管怎样,任务要一个接一个执行,一个接一个同步调用即可:
factorial(number));
other processings...
它使代码更干净、更易于维护,并且没有性能损失。