亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

1100行代碼設計一個線程池

2019-11-18 12:21:20
字體:
來源:轉載
供稿:網友

  在現代的操作系統中,有一個很重要的概念――線程,幾乎所有目前流行的操作系統都支持線程,線程來源于操作系統中進程的概念,進程有自己的虛擬地址空間以及正文段、數據段及堆棧,而且各自占有不同的系統資源(例如文件、環境變量等等)。與此不同,線程不能單獨存在,它依附于進程,只能由進程派生。假如一個進程派生出了兩個線程,那這兩個線程共享此進程的全局變量和代碼段,但每個線程各擁有各自的堆棧,因此它們擁有各自的局部變量,線程在UNIX系統中還被進一步分為用戶級線程(由進程自已來治理)和系統級線程(由操作系統的調度程序來治理)。
  
  既然有了進程,為什么還要提出線程的概念呢?因為與創建一個新的進程相比,創建一個線程將會耗費小得多的系統資源,對于一些小型的應用,可能感覺不到這點,但對于那些并發進程數非凡多的應用,使用線程會比使用進程獲得更好的性能,從而降低操作系統的負擔。另外,線程共享創建它的進程的全局變量,因此線程間的通訊編程會更將簡單,完全可以拋棄傳統的進程間通訊的ipC編程,而采用共享全局變量來進行線程間通訊。
  
  有了上面這個概念,我們下面就進入正題,來看一下線程池究竟是怎么一回事?其實線程池的原理很簡單,類似于操作系統中的緩沖區的概念,它的流程如下:先啟動若干數量的線程,并讓這些線程都處于睡眠狀態,當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求后,線程又處于睡眠狀態。可能你也許會問:為什么要搞得這么麻煩,假如每當客戶端有新的請求時,我就創建一個新的線程不就完了?這也許是個不錯的方法,因為它能使得你編寫代碼相對輕易一些,但你卻忽略了一個重要的問題――性能!就拿我所在的單位來說,我的單位是一個省級數據大集中的銀行網絡中心,高峰期每秒的客戶端請求并發數超過100,假如為每個客戶端請求創建一個新線程的話,那耗費的CPU時間和內存將是驚人的,假如采用一個擁有200個線程的線程池,那將會節約大量的的系統資源,使得更多的CPU時間和內存用來處理實際的商業應用,而不是頻繁的線程創建與銷毀。
  
  既然一切都明白了,那我們就開始著手實現一個真正的線程池吧,線程編程可以有多種語言來實現,例如C、C++、java等等,但不同的操作系統提供不同的線程API接口,為了讓你能更明白線程池的原理而避免陷入煩瑣的API調用之中,我采用了JAVA語言來實現它,由于JAVA語言是一種跨平臺的語言,因此你不必為使用不同的操作系統而無法編譯運行本程序而苦惱,只要你安裝了JDK1.2以上的版本,都能正確地編譯運行本程序。另外JAVA語言本身就內置了線程對象,而且JAVA語言是完全面像對象的,因此能夠讓你更清楚地了解線程池的原理,假如你注重看一下本文的標題,你會發現整個示例程序的代碼只有大約100行。
  
  本示例程序由三個類構成,第一個是TestThreadPool類,它是一個測試程序,用來模擬客戶端的請求,當你運行它時,系統首先會顯示線程池的初始化信息,然后提示你從鍵盤上輸入字符串,并按下回車鍵,這時你會發現屏幕上顯示信息,告訴你某個線程正在處理你的請求,假如你快速地輸入一行行字符串,那么你會發現線程池中不斷有線程被喚醒,來處理你的請求,在本例中,我創建了一個擁有10個線程的線程池,假如線程池中沒有可用線程了,系統會提示你相應的警告信息,但假如你稍等片刻,那你會發現屏幕上會陸陸續續提示有線程進入了睡眠狀態,這時你又可以發送新的請求了。
  
  第二個類是ThreadPoolManager類,顧名思義,它是一個用于治理線程池的類,它的主要職責是初始化線程池,并為客戶端的請求分配不同的線程來進行處理,假如線程池滿了,它會對你發出警告信息。
  
  最后一個類是SimpleThread類,它是Thread類的一個子類,它才真正對客戶端的請求進行處理,SimpleThread在示例程序初始化時都處于睡眠狀態,但假如它接受到了ThreadPoolManager類發過來的調度信息,則會將自己喚醒,并對請求進行處理。
  首先我們來看一下TestThreadPool類的源碼
  
  //TestThreadPool.java
  1 import java.io.*;
  2
  3
  4 public class TestThreadPool
  5 {
  6 public static void main(String[] args)
  7 {
  8 try{
  9 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10 String s;
  11 ThreadPoolManager manager = new ThreadPoolManager(10);
  12 while((s = br.readLine()) != null)
  13 {
  14 manager.PRocess(s);
  15 }
  16 }catch(IOException e){}
  17 }
  18 }
  
  由于此測試程序用到了輸入輸入類,因此第1行導入了JAVA的基本IO處理包,在第11行中,我們創建了一個名為manager的類,它給ThreadPoolManager類的構造函數傳遞了一個值為10的參數,告訴ThreadPoolManager類:我要一個有10個線程的池,給我創建一個吧!第12行至15行是一個無限循環,它用來等待用戶的鍵入,并將鍵入的字符串保存在s變量中,并調用ThreadPoolManager類的process方法來將這個請求進行處理。
  
  下面我們再進一步跟蹤到ThreadPoolManager類中去,以下是它的源代碼:
  
  //ThreadPoolManager.java
  1 import java.util.*;
  2
  3
  4 class ThreadPoolManager
  5 {
  6
  7 private int maxThread;
  8 public Vector vector;
  9 public void setMaxThread(int threadCount)
  10 {
  11 maxThread = threadCount;
  12 }
  13
  14 public ThreadPoolManager(int threadCount)
  15 {
  16 setMaxThread(threadCount);
  17 System.out.println("Starting thread pool...");
  18 vector = new Vector();
  19 for(int i = 1; i <= 10; i++)
  20 {
  21 SimpleThread thread = new SimpleThread(i);
  22 vector.addElement(thread);
  23 thread.start();
  24 }
  25 }
  26
  27 public void process(String argument)
  28 {
  29 int i;
  30 for(i = 0; i < vector.size(); i++)
  31 {
  32 SimpleThread currentThread = (SimpleThread)vector.elementAt(i);
  33 if(!currentThread.isRunning())
  34 {
  35 System.out.println("Thread "+ (i+1) +" is processing:" +
  argument);
  36 currentThread.setArgument(argument);
  37 currentThread.setRunning(true);
  38 return;
  39 }
  40 }
  41 if(i == vector.size())
  42 {
  43 System.out.println("pool is full, try in another time.");
  44 }
  45 }
  46 }//end of class ThreadPoolManager
  
  我們先關注一下這個類的構造函數,然后再看它的process()方法。第16-24行是它的構造函數,首先它給ThreadPoolManager類的成員變量maxThread賦值,maxThread表示用于控制線程池中最大線程的數量。第18行初始化一個數組vector,它用來存放所有的SimpleThread類,這時候就充分體現了JAVA語言的優越性與藝術性:假如你用C語言的話,至少要寫100行以上的代碼來完成vector的功能,而且C語言數組只能容納類型統一的基本數據類型,無法容納對象。好了,閑話少說,第19-24行的循環完成這樣一個功能:先創建一個新的SimpleThread類,然后將它放入vector中去,最后用thread.start()來啟動這個線程,為什么要用start()方法來啟動線程呢?因為這是JAVA語言中所規定的,假如你不用的話,那這些線程將永遠得不到激活,從而導致本示例程序根本無法運行。
  下面我們再來看一下process()方法,第30-40行的循環依次從vector數組中選取SimpleThread線程,并檢查它是否處于激活狀態(所謂激活狀態是指此線程是否正在處理客戶端的請求),假如處于激活狀態的話,那繼續查找vector數組的下一項,假如vector數組中所有的線程都處于激活狀態的話,那它會打印出一條信息,提示用戶稍候再試。相反假如找到了一個睡眠線程的話,那第35-38行會對此進行處理,它先告訴客戶端是哪一個線程來處理這個請求,然后將客戶端的請求,即字符串argument轉發給SimpleThread類的setArgument()方法進行處理,并調用SimpleThread類的setRunning()方法來喚醒當前線程,來對客戶端請求進行處理。
  
  可能你還對setRunning()方法是怎樣喚醒線程的有些不明白,那我們現在就進入最后一個類:SimpleThread類,它的源代碼如下:
  
  //SimpleThread.java
  1 class SimpleThread extends Thread
  2 {
  3 private boolean runningFlag;
  4 private String argument;
  5 public boolean isRunning()
  6 {
  7 return runningFlag;
  8 }
  9 public synchronized void setRunning(boolean flag)
  10 {
  11 runningFlag = flag;
  12 if(flag)
  13 this.notify();
  14 }
  15
  16 public String getArgument()
  17 {
  18 return this.argument;
  19 }
  20 public void setArgument(String string)
  21 {
  22 argument = string;
  23 }
  24
  25 public SimpleThread(int threadNumber)
  26 {
  27 runningFlag = false;
  28 System.out.println("thread " + threadNumber + "started.");
  29 }
  30
  31 public synchronized void run()
  32 {
  33 try{
  34 wh

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美最新羞羞视频在线观看| 欧美激情欧美激情在线五月| 日韩高清a**址| 亚洲欧美日韩爽爽影院| 亚洲精品网址在线观看| 欧美午夜www高清视频| 欧美日本精品在线| 亚洲国产另类 国产精品国产免费| 国产成人中文字幕| 青草成人免费视频| 在线成人激情黄色| 91免费在线视频| 日韩av一区在线观看| 色www亚洲国产张柏芝| 38少妇精品导航| 中文字幕免费精品一区| 亚洲影视中文字幕| 久久人人爽人人| 久久精品国产69国产精品亚洲| 日本久久久久久久久久久| 57pao成人永久免费视频| 91亚洲一区精品| 国产精品日韩在线| 精品久久久精品| 一区二区三区天堂av| 亚洲国产精品人人爽夜夜爽| 亚洲国产欧美一区二区三区久久| 国产精品入口免费视| 亚洲欧美日韩久久久久久| 成人av在线天堂| 国内精品免费午夜毛片| 久久久国产精品亚洲一区| 亚洲欧美日韩在线高清直播| 美女性感视频久久久| 爱福利视频一区| 精品一区二区三区电影| 欧美精品制服第一页| 日韩精品久久久久久久玫瑰园| 久久久亚洲天堂| 国产精品国语对白| 久久成年人视频| 欧美性猛交xxxx乱大交蜜桃| 国产精品亚洲网站| 日韩欧美亚洲综合| 亚洲va欧美va在线观看| 亚洲最大福利网| 国产精品mp4| 在线午夜精品自拍| www.亚洲免费视频| 日韩在线免费观看视频| 亚洲无限av看| 国产精品一区二区三区在线播放| 欧美高清自拍一区| 国产日韩在线播放| 中文字幕日韩欧美| 久久国产视频网站| 日韩av三级在线观看| 国产精品偷伦视频免费观看国产| 国产亚洲美女久久| 亚洲美女av在线| 午夜精品一区二区三区视频免费看| 欧美精品九九久久| 日韩人在线观看| 热99精品里视频精品| 91免费电影网站| 亚洲人成电影在线| 成人网在线观看| 日韩av在线精品| 国产精品久久网| 98精品在线视频| 国产99久久精品一区二区| 日韩精品中文字幕在线| 亚洲成av人影院在线观看| 69国产精品成人在线播放| 日韩中文字幕不卡视频| 久久久久久一区二区三区| 国产精品久久久久av免费| 91在线色戒在线| 亚洲性生活视频| 国产盗摄xxxx视频xxx69| 欧美—级a级欧美特级ar全黄| 国产91色在线播放| 18一19gay欧美视频网站| 亚洲欧洲一区二区三区久久| 2019av中文字幕| 欧美午夜精品久久久久久久| 亚洲有声小说3d| 国产免费一区二区三区香蕉精| 久久视频在线看| 久久亚洲国产成人| 久久精品亚洲94久久精品| 欧美日韩美女在线观看| 精品动漫一区二区三区| 欧美激情一区二区久久久| 亚洲欧美日韩中文在线制服| 国产日韩欧美在线播放| 亚洲欧美www| 欧美亚洲国产视频小说| 91久久久久久久一区二区| 亚洲女人天堂成人av在线| 精品一区精品二区| 色悠悠久久久久| 欧美诱惑福利视频| 国产91精品久久久久| 国产精品美女网站| 亚洲精品自拍视频| 久久亚洲精品小早川怜子66| 国产精品久久99久久| 久久久亚洲网站| 97视频在线观看播放| 国产精品电影在线观看| 亚洲美女av在线播放| 国产日韩欧美在线看| 国产激情综合五月久久| 午夜伦理精品一区| 国模精品视频一区二区| 国产z一区二区三区| 成人动漫网站在线观看| 91精品久久久久久久久青青| 欧美一区第一页| 亚洲免费一级电影| 久久久久久久久电影| 亚洲精品理论电影| 亚洲第一免费网站| 欧美性少妇18aaaa视频| 亚洲毛片在线免费观看| 成人www视频在线观看| 日韩成人激情视频| 国产极品精品在线观看| 精品视频一区在线视频| 中文国产亚洲喷潮| 97激碰免费视频| 成人免费在线视频网站| 精品久久久国产精品999| 欧美日在线观看| 国产精品揄拍一区二区| 日韩中文字幕网| 国语自产精品视频在线看一大j8| 久久99久国产精品黄毛片入口| 国产成人精品网站| 亚洲大胆人体视频| 国产午夜精品免费一区二区三区| www日韩欧美| 国产三级精品网站| 亚洲精品久久久久久下一站| 久久九九精品99国产精品| 懂色aⅴ精品一区二区三区蜜月| 一本久久综合亚洲鲁鲁| 亚洲天堂av女优| 亚洲国内精品视频| 国产乱人伦真实精品视频| 国产精品久久久久久五月尺| 一本一道久久a久久精品逆3p| 久久亚洲国产精品成人av秋霞| 精品福利免费观看| 亚洲综合在线播放| 国产日韩换脸av一区在线观看| 91精品久久久久久| 国产成人精品av在线| 国产精品第三页| 精品久久久国产精品999| 精品国产一区二区三区久久狼黑人| 亚洲精品乱码久久久久久按摩观| 亚洲欧美制服第一页|