如果找到了对您有用的资料,烦请点击右手边的Google广告支持我继续共享知识,谢谢! http://dengpeng.spaces.live.com/

2007年3月8日星期四

JDK1.5中的线程池使用简介

在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。这里介绍的就是1.5种的线程池的简单使用方法。
创建日期:2005-05-11
最后修改日期:2007-03-06
panhaidong@gmail.com

 

一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

 

ThreadPoolExecutor(int corePoolSize, 
int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
 


  • corePoolSize
    线程池维护线程的最少数量
  • maximumPoolSiz
    线程池维护线程的最大数量
  • keepAliveTime
    线程池维护线程所允许的空闲时间
  • unit
    线程池维护线程所允许的空闲时间的单位
  • workQueue
    线程池所使用的缓冲队列
  • handler
    线程池对拒绝任务的处理策略

一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:


  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:

  • ThreadPoolExecutor.AbortPolicy()
    抛出java.util.concurrent.RejectedExecutionException异常
  • ThreadPoolExecutor.CallerRunsPolicy()
    重试添加当前的任务,他会自动重复调用execute()方法
  • ThreadPoolExecutor.DiscardOldestPolicy()
    抛弃旧的任务
  • ThreadPoolExecutor.DiscardPolicy()
    抛弃当前的任务

二、一般用法举例


 

package cn.simplelife.exercise;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThreadPool {
private static int produceTaskSleepTime = 2;
public static void main(String[] args) {
//构造一个线程池
ThreadPoolExecutor producerPool = new ThreadPoolExecutor(2, 4, 0,
TimeUnit.SECONDS, new ArrayBlockingQueue(3),
new ThreadPoolExecutor.DiscardOldestPolicy());

//每隔produceTaskSleepTime的时间向线程池派送一个任务。
int i=1;
while(true){
try {
Thread.sleep(produceTaskSleepTime);

String task = "task@ " + i;
System.out.println("put " + task);

producerPool.execute(new ThreadPoolTask(task));

i++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}







package cn.simplelife.exercise;

import java.io.Serializable;

/**
* Ï̳߳ØÖ´ÐеÄÈÎÎñ
* @author hdpan
*/

public class ThreadPoolTask implements Runnable,Serializable{

//JDK1.5中,每个实现Serializable接口的类都推荐声明这样的一个ID
private static final long serialVersionUID = 0;

private static int consumeTaskSleepTime = 2000;
private Object threadPoolTaskData;

ThreadPoolTask(Object tasks){
this.threadPoolTaskData = tasks;
}

//每个任务的执行过程,现在是什么都没做,除了print和sleep,:)
public void run(){
System.out.println("start .."+threadPoolTaskData);
try {
//便于观察现象,等待一段时间
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
}


对这两段程序的说明:



  1. 在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。
  2. 一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。
  3. 在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。

    • 这个小组里面队员至少有两个,如果他们两个忙不过来, 任务就被放到任务列表里面。
    • 如果积压的任务过多,多到任务列表都装不下(超过3个)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员, 至多只能雇佣 4个。
    • 如果四个队员都在忙时,再有新的任务, 这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发, 直到接受这个任务为止(更残忍!呵呵)。
    • 因为队员工作是需要成本的,如果工作很闲,闲到 3SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是,为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。

  4. 通过调整 produceTaskSleepTime和 consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制, 改变这两个值就可以观察不同速率下程序的工作情况。
  5. 通过调整4中所指的数据,再加上调整任务丢弃策略, 换上其他三种策略,就可以看出不同策略下的不同处理方式。
  6. 对于其他的使用方法,参看jdk的帮助,很容易理解和使用。

 

本文摘自SimpleLife

7 条评论:

123 说...

搬家公司坐月子中心 坐月子中心台中 台北搬家公司 新竹搬家公司 桃園搬家公司 桃園房屋買賣 桃園房屋仲介 桃園房屋買賣 桃園房屋仲介 乳癌 全身健康檢查 自由行 三久 太陽能 三久太陽能 慈善機構 租辦公室 買辦公室 素食餐廳 氣球佈置 二手車 健檢 醫學美容 淨膚雷射 汽車美容 法拍屋 水餃 清潔公司 塑膠袋批發 塑膠袋工廠 實驗動物 到府坐月子 Disposable plastic cups Disposable products 宜蘭住宿坐月子中心 坐月子餐 孕婦 月子餐 美國月子中心 frying machine 團體服 OBU 投審會 google關鍵字廣告 會計師事務所 會計師 工商登記 彌月蛋糕 公司登記 保時捷 法拉利 福利 <包子 肉粽 宅配美食

123 说...

四神湯 搬家公司 訂房網 花東旅遊 桃園土地 桃園房屋仲介 巴里島 到府坐月子 中古車 坐月子中心台北 台北人力銀行 三久麻糬
創業加盟 水餃 壯陽食品 櫻花牌熱水器 素食月子餐 香港自由行 化妝品盒 湯包 桃園房屋 桃園房屋網 通馬桶 抽水肥 包通 馬桶不通 通馬桶 通水管 DC Jack tact switch Slide switch Phone Jack USB connector RCA Jack 開 關 製網 菱形網 不鏽鋼網 金屬網 無塵室射出 Disposable plastic cups Oem代工廠 breading machine vegetable machine ECO products Biodegradable plastic PLA 律師事務所 律師 寵物醫院 polylactic acid Plastic injection Mold development Injection Mold Plastic injection molding led招牌

123 说...

Injection molding ISO9001認證 射出成形 塑膠製成品 塑膠模具設計 模具開發 精密射出 縫衣機塑件 Industrial PCB Heavy Copper PCB Microwave PCB Medical PCB 醫學美容診所 肉毒桿菌 肉毒桿菌瘦臉 醫學美容 整型診所 美國月子中心 徵信 徵信公司 網路行銷 食品批發 交友太陽能熱水器 環保袋 慈善基金會婚友 婚友社 婚友聯誼 愛情公寓 相親 相親銀行 聯誼 命理網 姓名學 Hook and Loop 婚禮佈置 太陽能熱水器 中華湯包 菱型網 不鏽鋼 壯陽 成人用品裝潢 裝潢工程 房屋裝潢春藥 壯陽藥品 持久 手工水餃 中華湯包 104法拍網 信義房屋 新竹花店 婚友聯誼社 Odm 印刷 彩色印刷

123 说...

早洩 漆彈 情趣用品 湯包 宜蘭民宿 宜蘭住宿 網路訂房 宜蘭飯店 新娘祕書 清潔公司 植牙 裝潢 室內設計 油漆粉刷 油漆工 油漆工程 洗鞋加盟 洗包包加盟 洗包包 創業加盟店 早餐店加盟 開店創業 創業開店 結婚金飾 鑽石婚戒 通水管 通水管 出軌 清潔公司 台北搬家公司 整形 韓風整形 整形 韓風整形 老人癡呆症 情緒管理 訂房網 線上訂房 室內裝潢 > 舊屋翻新 裝潢施工 木工裝潢mini usb情人花束 催情 增大 模具廠 居家裝潢 團購美食 裝潢設計 馬桶 馬桶不通 國外旅遊 國外機票 團體旅遊 直航機票 簽證 熱水器 蘭花 化糞池 抽化糞池 抽水肥

匿名 说...

水管不通> 馬桶 馬桶不通 上順旅行社 五福旅行社 大興旅行社 天喜旅行社 天福旅行社 日本旅行社 日本旅遊 會場設計 紙盒訂裝 展覽設計 便宜機票 展場設計 二手車 中古車 展場設計 展覽設計 消防設備 消防設備 機電 崴立機電 牙齒美白 特色餐廳 景觀餐廳 親子餐廳 植牙 牙周病治療方法 白內障 心絲蟲 腎衰竭 狗皮膚病 RF PCB 植牙費用 牙周病 光纖美白除毛 肉毒桿菌除皺 便宜機票 國內旅遊 紙袋包裝 當鋪 當舖 拉麵 T恤 慈善 店面租賃 店面出租 店面出售 Plastic Drinking Cups 宜蘭民宿 花茶 花草茶 肝癌 健康檢查 身體檢查 飛梭雷射 雷射溶脂 直航機票 養生茶 招牌 台北法拍屋 會場佈置

匿名 说...

洗鞋加盟 酒店式公寓 旅行社 slot machine manufacturer 杭州旅遊 北京自由行 上海自由行 旅遊網 律師 台北民宿 手提紙袋 紙袋工廠 包裝紙袋 手提袋 包裝盒 股票教學 股市分析 股市億萬贏家 股票軟體 股票行情 太陽能 日本訂房 包通 彌月禮盒 塑膠射出成型 iso認證 iso 團體旅遊 商用不動產 辦公室 台北辦公室 辦公室出租 廠辦 安泰登峰 汽車美容 風水擺設 風水 居家風水 工廠風水 陽宅 命理風水 陽宅風水 勘輿 風水地理 簽證 保養 美國月子中心 slot game machine slot machine cabinet Bmw 中古車買賣 汽車借款 gaming machine manufacturer 班服

匿名 说...

招牌製作 ferrari 婚禮 禮服 結婚 婚紗照 婚紗攝影 無刀雷射 雷射近視 眼睛雷射 近視雷射 眼科 近視雷射 眼科 近視 眼科 美國 歐洲 印度 義大利 英國 法國 西班牙 京都 東京 埃及 房屋買賣 賓士 lexus 紙袋印刷 會場設計 貸款 票貼 二胎 包裝紙盒 融資 工商融資 支票貼現日本機票 日本自由行 搬家公司 借款 法律事務所 馬桶不通 food forming patty machine boiling machine 化妝品包 裝 紙盒 消毒 離婚 洗水塔通水管獸醫院 寵物住宿 通馬桶 Rigid-Flex PCB 動物醫院 洗鞋店