我們有一個服務方法GetDataParallel(),它可能被許多客戶端當前調用,我們使用ExecutorService來調用它內部的MyCallable。但是我發現,除非我調用executorService.shutdown();應用程序永遠不會退出,那麼爲什麼應用程序不能退出,我們必須在應用程序退出之前手動關閉所有線程池線程?在服務環境中,我認爲我們不需要調用executorService.shutdown();保持應用程序活着,對嗎?當executorService.shutdown();應該叫
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreading {
static ExecutorService executorService = Executors.newFixedThreadPool(100);
private List<String> _BusinessUnits= new ArrayList<String>();
public static void main(String[] args) throws Exception {
MultiThreading kl =new MultiThreading();
kl.GetDataParallel();
Thread.sleep(10000);
System.out.println("111111111");
//executorService.shutdown();
}
public void GetDataParallel() throws Exception
{
_BusinessUnits.add("BU1");
_BusinessUnits.add("BU2");
_BusinessUnits.add("BU3");
for(final String v : _BusinessUnits)
{
ExecutorServiceTest.executorService.submit(new MyCallable());
}
}
}
class MyCallable implements Callable {
@Override
public String call() throws Exception {
Thread.sleep(1000);
//return the thread name executing this callable task
System.out.println(Thread.currentThread().getName());
return Thread.currentThread().getName();
}
}
執行程序線程不是守護線程,因此當他們正在運行的JVM將不會終止。您必須手動關閉它們。 http://stackoverflow.com/questions/2213340/what-is-daemon-thread-in-java我想你可以使用提供守護線程的自定義ThreadFactory,但關機更直接,更清潔,更安全,特別是如果你在做你的任務。 –
@Jason C,「跑步時」的含義是什麼?運行意味着執行代碼的線程,或者它們只停留在線程池中?你知道線程在1秒後完成了可調用,因此1秒後它不應該處於運行狀態,但是應用程序在很多時間後仍然不會退出。 – Jason
如果它們處於活動狀態,則在線程池中。不一定執行任務。例如。即使隊列爲空,固定線程池中的線程也始終運行。如果沒有任務,高速緩存線程池中的線程最終會閒置並死掉。調用關機將終止線程。 –