我對學習 java.util.concurrent 比較陌生。在實作一個基本程式(如下)時,很明顯主執行緒等待 Callable 回傳一個值。
public class FutureTaskTutorial {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask = new FutureTask(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
System.out.println(futureTask.get());
System.out.println("main thread done!");
}
}
class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
Thread.sleep(5000);
return "Callable task done!";
}
}
輸出:<5 秒后>
可呼叫任務完成!
主線完成!
我的問題是:如果我的可呼叫物件將阻塞主執行緒并且無法實作異步行為,那么使用 FutureTask 有什么意義?
uj5u.com熱心網友回復:
FutureTask#get可能會阻塞,但是 的用例FutureTasks是定期檢查它們是否已完成,同時仍在執行 main 方法的其余部分。例如:
FutureTask<Object> task = new FutureTask<>( () ->
{
Thread.sleep( 1_000 );
return "Hello world";
} );
Executors.newSingleThreadExecutor().execute( task );
boolean doMainWork = true;
while( doMainWork )
{
if( task.isDone() )
{
System.out.println( task.get() );
doMainWork = false;
}
System.out.println( "Main working " task.isDone() );
Thread.sleep( 500 );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467930.html
下一篇:在回圈中將滑鼠事件設定為多個標簽
