我正在嘗試編寫一個程序,它將在多個Java工作線程中劃分工作。問題是,當我從命令行運行它時,它永遠不會返回。我沒有得到我的提示,最終必須按ctrl-c關閉程序。使用ExecutorService的Java應用程序永遠不會關閉
我它簡化爲以下瑣碎的情況下
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestExeServ {
private class ExpensiveTask implements Callable<Integer>{
private final String msg;
public ExpensiveTask(String str){
this.msg = str;
}
@Override
public Integer call() {
System.out.println("My message was " + msg);
return 1;
}
}
private void run()
{
final ExecutorService exeServ = Executors.newFixedThreadPool(2);
Future<Integer> result = exeServ.submit(new ExpensiveTask("Hello!"));
try {
System.out.println(" Task is done, it returned " + result.get());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[])
{
System.out.println("Start");
TestExeServ tes = new TestExeServ();
tes.run();
System.out.println("Done");
}
}
這個程序的輸出是
[email protected]:/local/mnt/workspace/TestExeServ/bin$ java TestExeServ
Start
my message was Hello!
Task is done, it returned 1
done
就是這樣。它掛在那裏。沒有提示。如果我刪除ExecutorService.submit行,我得到
[email protected]:/local/mnt/workspace/TestExeServ/bin$ java TestExeServ
Start
done
[email protected]:/local/mnt/workspace/TestExeServ/bin$
程序自然關閉。
是否有一些清理任務需要在ExecutorService上執行,我做得不好?我假設.get()調用加入了線程。情況並非如此嗎?
您需要關閉執行程序 –
或者使用生成守護程序線程的線程工廠。 – assylias
或設置標誌allowCoreThreadTimeout [ThreadPoolExecutor應用程序沒有完成](http://stackoverflow.com/q/30633698/217324) –