今日份雞湯:給自己時(shí)間乡革,不要焦急;一步一步來(lái)摊腋,一日一日過沸版。
問題:
接著上一篇的小工具,執(zhí)行效率太慢了(當(dāng)時(shí)也沒想到會(huì)那么慢)兴蒸,我記得大概獲取完全部數(shù)據(jù)用了40多分鐘视粮,當(dāng)時(shí)忙其他事情,也就沒管了橙凳,后來(lái)就想著用線程池來(lái)處理一下蕾殴,然后就出現(xiàn)了這個(gè)問題笑撞,任務(wù)執(zhí)行完,但是程序一直沒有退出钓觉。
來(lái)吧茴肥,展示一下問題現(xiàn)象:
問題分析:
剛開始沒有打印日志,以為就是數(shù)據(jù)多執(zhí)行慢荡灾,后來(lái)觀察輸出文件的內(nèi)容(上一篇的)瓤狐,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)都獲取完了,然后就檢查一下代碼批幌,確認(rèn)沒有哪塊寫錯(cuò)础锐,然后就感覺隱約記得是不是要關(guān)閉線程池,這是我之前看過的內(nèi)容荧缘,雖然記不清楚了郁稍,但是模糊還是有點(diǎn)印象的,于是就百度一下唄胜宇。果然讓這個(gè)模糊的記憶一下子就清晰了:使用線程池時(shí)耀怜,在main完成之前沒有調(diào)用shutdown(),使得java進(jìn)程不會(huì)結(jié)束桐愉〔破疲總結(jié)來(lái)說(shuō)就是:線程池默認(rèn)創(chuàng)建的Worker線程是“非守護(hù)線程”,thread.setDaemon(false)从诲,在JDK1.5的時(shí)候左痢,就規(guī)定了當(dāng)所有非守護(hù)線程退出時(shí),JVM才會(huì)退出系洛,Main方法主線程和Worker線程都是非守護(hù)線程俊性,所以不會(huì)死。
問題解決:
ExecutorService.shutdown()描扯,就會(huì)把之前通過Executor.execute()提交的任務(wù)運(yùn)行結(jié)束后關(guān)閉線程池定页。
這樣就可以啦~
demo代碼:
import java.util.concurrent.*;
public class ThreadPoolDemo {
public static void main(String[] args) throws InterruptedException {
final ExecutorService FIXED_THREAD_POOL = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),
new ThreadPoolExecutor.DiscardOldestPolicy());
CountDownLatch latch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
FIXED_THREAD_POOL.execute( () -> {
try {
myTest();
} catch (Exception e) {
} finally {
latch.countDown();
}
});
}
latch.await();
System.out.println("執(zhí)行到這里啦。绽诚。典徊。。恩够。");
FIXED_THREAD_POOL.shutdown();
}
public static void myTest () {
System.out.println("this is my test !!!");
}
}