日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程——线程池初步

發布時間:2025/3/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程——线程池初步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述:

? 線程池機制是事先創建一些線程等待服務端程序的調用,這些線程保存在一個數組結構中,稱為“線程池”。當服務器有任務執行時,就從線程池中取出一個線程并給其分配任務,當線程任務執行完成后,再被放回線程池中。


優點:

? 1. 由于在任務到達之前,線程已經存在,所以這里為系統消除了線程創建的資源和時間的開銷。可以立即為請求服務,使程序響應更快。

? 2. 通過適當地調節線程池中的線程數目,就強制使一些新到的任務處于等待狀態,可以防止資源不足。


參考:

http://www.cnblogs.com/dolphin0520/p/3932921.html

《Java語言程序設計》——清華大學出版社


示例及分析:

MyTask.java

public class MyTask implements Runnable {private int taskNum;public MyTask(int num) {this.taskNum = num;}@Overridepublic void run() {System.out.println("正在執行task " + taskNum);try {Thread.currentThread().sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("task " + taskNum + "執行完畢");}} 上面的程序很簡單,就只是去打印一些簡單的信息。


Executor.java

public class Executor {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5));for (int i = 0; i < 15; i++) {MyTask myTask = new MyTask(i);if (!executor.isShutdown()) {executor.execute(myTask);}printExecutor(executor);}executor.shutdown();}private static void printExecutor(ThreadPoolExecutor executor) {System.out.println("線程池中線程數目:" + executor.getPoolSize()+ ",隊列中等待執行的任務數目:" + executor.getQueue().size()+ ",已執行完別的任務數目:" + executor.getCompletedTaskCount());} }


上面用到了java為我們提供的類ThreadPoolExecutor,這是一個很好的類。上面用到創建實例時用到的構造器如下:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}


它包含了下面這只個參數:

? int corePoolSize:線程池中線程數
? int maximumPoolSize:線程池中最大的線程數
? long keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止
? TimeUnit unit:參數keepAliveTime的時間單位,在TimeUnit類中有7種靜態屬性:

TimeUnit.DAYS; //天 TimeUnit.HOURS; //小時 TimeUnit.MINUTES; //分鐘 TimeUnit.SECONDS; //秒 TimeUnit.MILLISECONDS; //毫秒 TimeUnit.MICROSECONDS; //微妙 TimeUnit.NANOSECONDS; //納秒
BlockingQueue<Runnable> workQueue:一個阻塞隊列,用來存儲等待執行的任務

<pre name="code" class="java">ArrayBlockingQueue; LinkedBlockingQueue; SynchronousQueue;


上面代碼中使用的是ArrayBlockingQueue阻塞隊列,并傳入了參數5。這里有一點需要注意一下,如果我們假設所有任務數為mTaskCount(即代碼中的15),那么我們最好去滿足這樣一個公式:maximumPoolSize >= mTaskCount -?corePoolSize,不然就會拋出一個java.util.concurrent.RejectedExecutionException異常。當然,你也可以有一個通用的行為:將maximumPoolSize設置為Integer.MAX_VALUE。


還有一種方式可以補救:

ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 200, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());


不過目前可能大家對ThreadPoolExecutor的使用可能也不那么頻繁了。因為Java為我們封裝好了一些更方便的創建方式:

ExecutorService executor1 = Executors.newFixedThreadPool(5); // 創建固定容量大小的緩沖池 ExecutorService executor2 = Executors.newSingleThreadExecutor(); // 創建容量為1的緩沖池 ExecutorService executor3 = Executors.newCachedThreadPool(); // 創建一個緩沖池,緩沖池容量大小為Integer.MAX_VALUE
下面是上面三種創建方式對應的結果輸出:

創建固定容量大小的緩沖池

正在執行task 0 正在執行task 2 正在執行task 4 正在執行task 1 正在執行task 3 task 4執行完畢 正在執行task 5 task 0執行完畢 正在執行task 6 task 2執行完畢 正在執行task 7 task 1執行完畢 正在執行task 8 task 3執行完畢 正在執行task 9 task 5執行完畢 task 7執行完畢 正在執行task 10 task 6執行完畢 正在執行task 11 正在執行task 12 task 9執行完畢 正在執行task 13 task 8執行完畢 正在執行task 14 task 11執行完畢 task 12執行完畢 task 10執行完畢 task 13執行完畢 task 14執行完畢


創建容量為1的緩沖池

正在執行task 0 task 0執行完畢 正在執行task 1 task 1執行完畢 正在執行task 2 task 2執行完畢 正在執行task 3 task 3執行完畢 正在執行task 4 task 4執行完畢 正在執行task 5 task 5執行完畢 正在執行task 6 task 6執行完畢 正在執行task 7 task 7執行完畢 正在執行task 8 task 8執行完畢 正在執行task 9 task 9執行完畢 正在執行task 10 task 10執行完畢 正在執行task 11 task 11執行完畢 正在執行task 12 task 12執行完畢 正在執行task 13 task 13執行完畢 正在執行task 14 task 14執行完畢

創建一個緩沖池,緩沖池容量大小為Integer.MAX_VALUE

正在執行task 0 正在執行task 2 正在執行task 4 正在執行task 6 正在執行task 8 正在執行task 10 正在執行task 12 正在執行task 14 正在執行task 1 正在執行task 3 正在執行task 5 正在執行task 9 正在執行task 7 正在執行task 11 正在執行task 13 task 2執行完畢 task 8執行完畢 task 6執行完畢 task 4執行完畢 task 0執行完畢 task 10執行完畢 task 14執行完畢 task 12執行完畢 task 1執行完畢 task 3執行完畢 task 5執行完畢 task 7執行完畢 task 9執行完畢 task 13執行完畢 task 11執行完畢


RejectedExecutionException異常:

http://blog.csdn.net/wzy_1988/article/details/38922449


總結

以上是生活随笔為你收集整理的Java并发编程——线程池初步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。