熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java線程:新特征-線程池

2022-06-13   來源: Java核心技術 

    Sun在Java對Java線程的類庫做了大量的擴展其中線程池就是Java的新特征之一除了線程池之外還有很多多線程相關的內容為多線程的編程帶來了極大便利為了編寫高效穩定可靠的多線程程序線程部分的新增內容顯得尤為重要
 
    有關Java線程新特征的內容全部在ncurrent下面裡面包含數目眾多的接口和類熟悉這部分API特征是一項艱難的學習過程目前有關這方面的資料和書籍都少之又少大所屬介紹線程方面書籍還停留在java之前的知識層面上
 
    當然新特征對做多線程程序沒有必須的關系在java之前通用可以寫出很優秀的多線程程序只是代價不一樣而已
 
    線程池的基本思想還是一種對象池的思想開辟一塊內存空間裡面存放了眾多(未死亡)的線程池中線程執行調度由池管理器來處理當有線程任務時從池中取一個執行完成後線程對象歸池這樣可以避免反復創建線程對象所帶來的性能開銷節省了系統的資源
 
    在Java之前要實現一個線程池是相當有難度的現在Java為我們做好了一切我們只需要按照提供的API來使用即可享受線程池帶來的極大便利
 
    Java的線程池分好多種固定尺寸的線程池可變尺寸連接池
 
    在使用線程池之前必須知道如何去創建一個線程池在Java需要了解的是ncurrentExecutors類的API這個類提供大量創建連接池的靜態方法是必須掌握的
 
固定大小的線程池
 


import ncurrentExecutors;
import ncurrentExecutorService;

/**
* Java線程線程池
*
* @author Administrator ::
*/
public class Test {
        public static void main(String[] args) {
                //創建一個可重用固定線程數的線程池
                ExecutorService pool = ExecutorsnewFixedThreadPool();
                //創建實現了Runnable接口對象Thread對象當然也實現了Runnable接口
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                //將線程放入池中進行執行
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                //關閉線程池
                poolshutdown();
        }
}

class MyThread extends Thread{
        @Override
        public void run() {
                Systemoutprintln(ThreadcurrentThread()getName()+正在執行);
        }
}
 


poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code
 
單任務線程池
 
    在上例的基礎上改一行創建pool對象的代碼為



                //創建一個使用單個 worker 線程的 Executor以無界隊列方式來運行該線程
                ExecutorService pool = ExecutorsnewSingleThreadExecutor();

 
    輸出結果為


poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code
 
    對於以上兩種連接池大小都是固定的當要加入的池的線程(或者任務)超過池最大尺寸時候則入此線程池需要排隊等待
一旦池中有線程完畢則排隊等待的某個線程會入池執行


 
 
可變尺寸的線程池
 
    與上面的類似只是改動下pool的創建方式


                //創建一個可根據需要創建新線程的線程池但是在以前構造的線程可用時將重用它們
                ExecutorService pool = ExecutorsnewCachedThreadPool();

 


poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code
 
延遲連接池
 



import ncurrentExecutors;
import ncurrentScheduledExecutorService;
import ncurrentTimeUnit;

/**
* Java線程線程池
*
* @author Administrator ::
*/
public class Test {
        public static void main(String[] args) {
                //創建一個線程池它可安排在給定延遲後運行命令或者定期地執行
                ScheduledExecutorService pool = ExecutorsnewScheduledThreadPool();
                //創建實現了Runnable接口對象Thread對象當然也實現了Runnable接口
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                //將線程放入池中進行執行
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                //使用延遲執行風格的方法
                poolschedule(t TimeUnitMILLISECONDS);
                poolschedule(t TimeUnitMILLISECONDS);
                //關閉線程池
                poolshutdown();
        }
}

class MyThread extends Thread {
        @Override
        public void run() {
                Systemoutprintln(ThreadcurrentThread()getName() + 正在執行);
        }
}
 



poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code


 
 
單任務延遲連接池
 
在四代碼基礎上做改動

                //創建一個單線程執行程序它可安排在給定延遲後運行命令或者定期地執行
                ScheduledExecutorService pool = ExecutorsnewSingleThreadScheduledExecutor();
 

poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code

 
自定義線程池
 


import ncurrentArrayBlockingQueue;
import ncurrentBlockingQueue;
import ncurrentThreadPoolExecutor;
import ncurrentTimeUnit;

/**
* Java線程線程池自定義線程池
*
* @author Administrator ::
*/
public class Test {
        public static void main(String[] args) {
                //創建等待隊列
                BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>();
                //創建一個單線程執行程序它可安排在給定延遲後運行命令或者定期地執行
                ThreadPoolExecutor pool = new ThreadPoolExecutor(TimeUnitMILLISECONDSbqueue);
                //創建實現了Runnable接口對象Thread對象當然也實現了Runnable接口
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                Thread t = new MyThread();
                //將線程放入池中進行執行
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                poolexecute(t);
                //關閉線程池
                poolshutdown();
        }
}

class MyThread extends Thread {
        @Override
        public void run() {
                Systemoutprintln(ThreadcurrentThread()getName() + 正在執行);
                try {
                        Threadsleep(L);
                } catch (InterruptedException e) {
                        eprintStackTrace();
                }
        }
}


 
 


poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行
poolthread正在執行

Process finished with exit code
 
    創建自定義線程池的構造方法很多本例中參數的含義如下


ThreadPoolExecutor

  public ThreadPoolExecutor(int corePoolSize int maximumPoolSize long keepAliveTime TimeUnit unit BlockingQueue<Runnable> workQueue)

用給定的初始參數和默認的線程工廠及處理程序創建新的 ThreadPoolExecutor使用 Executors 工廠方法之一比使用此通用構造方法方便得多
參數
corePoolSize 池中所保存的線程數包括空閒線程
maximumPoolSize 池中允許的最大線程數
keepAliveTime 當線程數大於核心時此為終止前多余的空閒線程等待新任務的最長時間
unit keepAliveTime 參數的時間單位
workQueue 執行前用於保持任務的隊列此隊列僅保持由 execute 方法提交的 Runnable 任務
拋出
IllegalArgumentException 如果 corePoolSize 或 keepAliveTime 小於零或者 maximumPoolSize 小於或等於零或者 corePoolSize 大於 maximumPoolSize
NullPointerException 如果 workQueue 為 null

 
    自定義連接池稍微麻煩些不過通過創建的ThreadPoolExecutor線程池對象可以獲取到當前線程池的尺寸正在執行任務的線程數工作隊列等等
 
    有關Java線程池的內容到此就沒有了更多的內容還需要研讀API來獲取
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26769.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.