頻道欄目
首頁 > 程序開發 > 軟件開發 > Java > 正文
Java架構學習之線程池使用講解
2018-07-27 13:52:19         來源:Leeue李月  
收藏   我要投稿

一、線程池

1、什么是線程池?
答:
    經常創建、啟動銷毀一個線程都是非常消耗時間的。
    使用線程池進行管理和復用線程,提高程序效率。

面試答:
Java線程池能帶來的3個好處:
 1、降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。
 2、提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
 3、提高線程的可管理性。線程是稀缺資源,如果無限制地創建,
 不僅會消耗系統資源。還會降低系統的穩定性。
 使用線程池可以統一分配、調優和監控,但是要合理利用。

Java使用線程核心走的是ThreadPoolExecutor。(構造函數)

二、使用線程池的方式

使用線程池的方式:
使用Executor 封裝好的四種線程池類型。
1、newCachodThreadPool創建一個可以緩存線程池,如果線程池長度超過處理需要
,可靈活回收空閑線程,若無可回收,則新建線程。
2、newFixedThreadPool 創建一個定長的線程池?煽刂凭程最大并發數,超出的
線程會在隊列中等待。
3、newFixedThreadPool 創建一個定長的線程池。
4、newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作
線程來執行任務。

三、線程池合理配置

CPU密集、IO密集。

四、4種創建線程池的方式

newCachedThreadPool 創建可以緩存的線程池

代碼:

package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @classDesc: 功能描述:(線程池四種創建方式 newCachedThreadPool 創建可緩存的線程池)
 * @author:
 * @Version:v1.0
 * @createTime:2018年7月24日 下午2:56:16
 */
public class NewCachedThreadPoolDemo {
    public static void main(String[] args) {
        // 1、創建可緩存的線程池 可以重復的利用
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newCachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}
顯示結果:本來程序是創建10個線程,這里就創建了7個,說明有3個在復用

這里寫圖片描述

newFixedThreadPool:創建固定長度的線程池

代碼:
package com.leeue;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * @classDesc: 功能描述:(可固定長度的線程池  newFixedThreadPool)
 * @author:李月
 * @Version:v1.0
 * @createTime:2018年7月24日 下午3:23:49
 */
public class newFixedThreadPoolDemo {
    public static void main(String[] args) {
        //快捷鍵 ctrl+2 +F 來創建變量名
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newFixedThreadPool.execute(new Runnable() {

                @Override
                public void run() {
                System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
                }
            });
        }

    }
}
顯示效果:

這里寫圖片描述

newScheduledThreadPool:創建可以定時執行的線程池

代碼執行:
package com.leeue;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 
 * @classDesc: 功能描述:(創建 可定時的線程池)
 * @author:
 * @Version:v1.0
 * @createTime:2018年7月24日 下午3:40:54
 */
public class NewScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newScheduledThreadPool.schedule(new Runnable() {

                @Override
                public void run() {
                    System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  

                }
            }, 3, TimeUnit.SECONDS);//定時3秒后 執行這個線程池
        }
    }
}
顯示效果:

這里寫圖片描述

newSingleThreadExecutor:單線程池

代碼:
package com.leeue;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * @classDesc: 功能描述:(單線程的線程池)
 * @author:
 * @Version:v1.0
 * @createTime:2018年7月24日 下午3:57:15
 */
public class NewSingleThreadScheduledDemo {
    public static void main(String[] args) {
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newSingleThreadExecutor.execute(new Runnable() {

                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}
顯示效果

這里寫圖片描述

停掉線程池的方法newSingleThreadExecutor.shutdown();//停掉線程池的方法

調用shoutdown()方法。

五、線程池原理分析

面試的時候主要談:核心線程池、最大線程數。
點擊復制鏈接 與好友分享!回本站首頁
上一篇:java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnn報錯解決辦法
下一篇:Java架構學習之jason、fastjson解析、xml使用、dom4j解析、java反射機制及手寫SpringIOC框架實例講解
相關文章
圖文推薦
點擊排行

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

加拿大28火车判定方法