中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么固定大小的線程池

發布時間:2021-06-21 10:10:58 來源:億速云 閱讀:153 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java怎么固定大小的線程池的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1.固定大小的線程池簡介

線程池就是在程序啟動的時候先建立幾個可以使用的線程放在那里,然后等著具體的任務放進去,這個任務基本可以說都是Runnable的實現類,因此它減小了系統每次新建和銷毀線程的開銷,但同時增加了維護這些線程的開銷,個中取舍看具體情況而定。

固定大小的線程池就是在啟動的時候創建了固定個數的線程放在那里等待使用。

2.包裝一個線程池對象

public class TaskPool{
    private final ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(9); // 創建一個大小為9的固定線程池,可以按照CPU的核數初步判定,如果CPU密集性任務則創建N+1個,如果是IO密集型任務則創建2N+1個,其中N即CPU的核數
    protected void shutdown(){
        // do something
        // 這個方法等待線程池中所有已提交任務執行結束,不接收新任務,然后結束
        executor.shutdown(); 
        // 這個強制結束所有任務,然后正在等在的任務列表
        // executor.shutdownNow(); 
    }
    protected void execute(Runnable command){
        // do something
        // 提交任務
        executor.execute(command); 
    }
    public void status(){
        StringBuffer sb = new StringBuffer();
        // 當前正在執行任務的線程數
        sb.append(executor.getActiveCount() + "\n"); 
        // 當前正在等待執行的線程數
        sb.append(executor.getQueue().size() + "\n"); 
        // 返回已經完成的線程數
        sb.append(executor.getCompletedTaskCount() + "\n"); 
        System.out.println(sb.toString());
        // 注:以上方法都是返回一個大概值,因為線程在執行中,這些狀態隨時都會改變
    }
}

3.使用線程池

public class Launcher{
    private TaskPool taskPool = new TaskPool();
    public static void main(String[] args){
        // 新建100個任務,Runnable的實現類Task
        Task[] tasks = new Task[100];
        for (int i = 0; i < tasks.length; i++){
            tasks[i] = new Task("Task " + (i+1));
            // 提交到線程池運行
            taskPool.execute(task[i]);
            if ( i % 50 == 0){
                taskPool.status();
        } 
    }
    private static class Task implements Runnable{
        private String name;
        public Task(String name){
            this.name = name;
        }
        public void run(){
            // do something
            System.out.println("我的名字是:" + this.name);
        }
    }
}

Java線程池小拓展

線程池的介紹

1 常用的 池化技術

C3P0

DBCP

2 線程池的衍生

頻繁的創建線程對象和多線程之間進行上下文切換,是非常耗時間和資源的所以JDK1.5中提出了線程池技術

3 使用線程池

Exector

4 線程池的創建

創建一個固定大小的線程池 ( 最常用的方法 )

ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//線程池的帶下只有兩個 現在這個任務在其等待隊列中排隊等候

創建可變大小的線程池

ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

創建獨立任務的線程池

ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

創建可調度的線程池

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);

感謝各位的閱讀!關于“Java怎么固定大小的線程池”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临泽县| 揭阳市| 兴化市| 达日县| 邳州市| 临泉县| 林西县| 天水市| 留坝县| 尉犁县| 疏附县| 江门市| 镇沅| 洛宁县| 凉城县| 盐池县| 余姚市| 宝兴县| 阜阳市| 海原县| 太仓市| 泰安市| 江油市| 宁南县| 琼结县| 龙里县| 凤翔县| 广南县| 会理县| 江津市| 龙口市| 徐汇区| 突泉县| 禄丰县| 衡阳市| 克什克腾旗| 怀宁县| 贵德县| 邵阳市| 买车| 巨野县|