完成Java線程

我看到這個問題被問了很多次。很抱歉再次問這個問題。我有個奇怪的問題。

我有一個通過ExecutorService作為單獨的可運行任務(wù)提交數(shù)千個作業(yè)的職務(wù)。這是在一個簡單的for循環(huán)中完成的。在for循環(huán)的末尾,我調(diào)用service.候機(),然后是一個等待高潮。

由于要提交的線程數(shù)量很大,所以線程一直掛起,直到所有任務(wù)都提交為止。

有任何方法,這些線程可以優(yōu)雅地終止,一旦它的執(zhí)行完成?

您可以創(chuàng)建一個新的ThreadPoolExecuto不打電話java.util.concurrent.Executors :

int corePoolSize = 0;
    int maximumPoolSize = 64;
    int keepAliveTime = 5000;
    ExecutorService executorService =
            new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
                    TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());

在javadoc中:“如果池當(dāng)前有多個corePoolSize線程,那么如果多余的線程已經(jīng)空閑超過了持有AliveTime,那么多余的線程將被終止”

編輯:
下面是一個很小的例子,如果您在Eclipse調(diào)試環(huán)境中運行這個示例,您應(yīng)該可以看到線程的來來去去:

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ExecutorTest {

    public static void main(String[] args) {

        ExecutorService executorService = new ThreadPoolExecutor(0, 64, 1000,
                        TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());

        for (int i = 0; i <= 500; i ++) {

            try {
                Thread.sleep(new Random().nextInt(200));
            } catch (InterruptedException e) {
            }

            executorService.submit(new TestTask());
        }
    }

    public static class TestTask implements Runnable {
        public void run() {
            try {
                Thread.sleep(new Random().nextInt(1500));
            } catch (InterruptedException e) {
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java線程池使用說明 一簡介 線程的使用在java中占有極其重要的地位,在jdk1.4極其之前的jdk版本中,關(guān)...
    哥哥是歐巴Vitory閱讀 187評論 0 0
  • 一、線程池簡介 Java并發(fā)編程中,我們常常使用以下兩種方法來開啟一個新的線程來并發(fā)完成某些任務(wù): 寫一個Thre...
    邱simple閱讀 1,473評論 0 2
  • 1,為什么要用線程池,優(yōu)勢 (1)降低資源消耗,通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。 (2) 提...
    陳二狗想吃肉閱讀 1,065評論 0 1
  • Java線程池 一、Executor(執(zhí)行器)框架 ? 創(chuàng)建一個新線程是有一定代價的,以為涉及與操作系統(tǒng)的交互...
    thorhill閱讀 1,678評論 4 23
  • 為什么使用線程池 當(dāng)我們在使用線程時,如果每次需要一個線程時都去創(chuàng)建一個線程,這樣實現(xiàn)起來很簡單,但是會有一個問題...
    閩越布衣閱讀 4,420評論 10 45

友情鏈接更多精彩內(nèi)容