日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java實現手寫一個簡單版的線程池

瀏覽:52日期:2023-02-10 14:47:07

有些人可能對線程池比較陌生,并且更不熟悉線程池的工作原理。所以他們在使用線程的時候,多數情況下都是new Thread來實現多線程。但是,往往良好的多線程設計大多都是使用線程池來實現的。 為什么要使用線程 降低資源的消耗。降低線程創建和銷毀的資源消耗。提高響應速度:線程的創建時間為T1,執行時間T2,銷毀時間T3,免去T1和T3的時間提高線程的可管理性

下圖所示為線程池的實現原理:調用方不斷向線程池中提交任務;線程池中有一組線程,不斷地從隊列中取任務,這是一個典型的生產者-消費者模型。

java實現手寫一個簡單版的線程池

要實現一個線程池,有幾個問題需要考慮:

隊列設置多長?如果是無界的,調用方不斷往隊列中方任務,可能導致內存耗盡。如果是有界的,當隊列滿了之后,調用方如何處理? 線程池中的線程個數是固定的,還是動態變化的? 每次提交新任務,是放入隊列?還是開新線程 當沒有任務的時候,線程是睡眠一小段時間?還是進入阻塞?如果進入阻塞,如何喚醒?

針對問題4,有3種做法:

不使用阻塞隊列,只使用一般的線程安全的隊列,也無阻塞/喚醒機制。當隊列為空時,線程池中的線程只能睡眠一會兒,然后醒來去看隊列中有沒有新任務到來,如此不斷輪詢。 不使用阻塞隊列,但在隊列外部,線程池內部實現了阻塞/喚醒機制 使用阻塞隊列

很顯然,做法3最完善,既避免了線程池內部自己實現阻塞/喚醒機制的麻煩,也避免了做法1的睡眠/輪詢帶來的資源消耗和延遲。現在來帶大家手寫一個簡單的線程池,讓大家更加理解線程池的工作原理

實戰:手寫簡易線程池

根據上圖可以知道,實現線程池需要一個阻塞隊列+存放線程的容器

/** * Five在努力 * 自定義線程池 */public class ThreadPool { /** 默認線程池中的線程的數量 */ private static final int WORK_NUM = 5; /** 默認處理任務的數量 */ private static final int TASK_NUM = 100; /** 存放任務 */ private final BlockingQueue<Runnable> taskQueue; private final Set<WorkThread> workThreads;//保存線程的集合 private int workNumber;//線程數量 private int taskNumber;//任務數量 public ThreadPool(){this(WORK_NUM , TASK_NUM); } public ThreadPool(int workNumber , int taskNumber) {if (taskNumber<=0){ taskNumber = TASK_NUM;}if (workNumber<=0){ workNumber = WORK_NUM;}this.taskQueue = new ArrayBlockingQueue<Runnable>(taskNumber);this.workNumber = workNumber;this.taskNumber = taskNumber;workThreads = new HashSet<>();//工作線程準備好了//啟動一定數量的線程數,從隊列中獲取任務處理for (int i=0;i<workNumber;i++) { WorkThread workThread = new WorkThread('thead_'+i); workThread.start(); workThreads.add(workThread);} } /** * 線程池執行任務的方法,其實就是往BlockingQueue中添加元素 * @param task */ public void execute(Runnable task) {try { taskQueue.put(task);} catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();} } /** * 銷毀線程池 */ public void destroy(){System.out.println('ready close pool...');for (WorkThread workThread : workThreads) { workThread.stopWorker(); workThread = null;//help gc}workThreads.clear(); } /** 內部類,工作線程的實現 */ private class WorkThread extends Thread{public WorkThread(String name){ super(); setName(name);}@Overridepublic void run() { while (!interrupted()) {try { Runnable runnable = taskQueue.take();//獲取任務 if (runnable !=null) {System.out.println(getName()+' ready execute:'+runnable.toString());runnable.run();//執行任務 } runnable = null;//help gc} catch (Exception e) { interrupt(); e.printStackTrace();} }}public void stopWorker(){ interrupt();} }}

上面代碼定義了默認的線程數量和默認處理任務數量,同時用戶也可以自定義線程數量和處理任務數量。用BlockingQueue阻塞隊列來存放任務。用set來存放工作線程,set的好處就不用多說了。懂的都懂

構造方法中new對象的時候,循環啟動線程,并把線程放入set中。WorkThread實現Thread,run方法實現也很簡單,因為有一個stop方法,所以這里需要while判斷,之后從taskQueue隊列中,獲取任務。如何獲取不到就阻塞,獲取到的話runnable.run();就執行任務,之后把任務變成null

銷毀線程只需要遍歷set,把每個線程停止,并且變為null就行了

執行線程任務execute,只需要從往阻塞隊列中添加任務就行了

測試一下:

public class TestMySelfThreadPool { private static final int TASK_NUM = 50;//任務的個數 public static void main(String[] args) {ThreadPool myPool = new ThreadPool(3,50);for (int i=0;i<TASK_NUM;i++) { myPool.execute(new MyTask('task_'+i));} } static class MyTask implements Runnable{private String name;public MyTask(String name) { this.name = name;}public String getName() { return name;}public void setName(String name) { this.name = name;}@Overridepublic void run() { try {Thread.sleep(1000); } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace(); } System.out.println('task :'+name+' end...');}@Overridepublic String toString() { // TODO Auto-generated method stub return 'name = '+name;} }}

java實現手寫一個簡單版的線程池

結果ok。沒什么問題

到此這篇關于java實現手寫一個簡單版的線程池的文章就介紹到這了,更多相關java 手寫線程池內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品超碰| 日韩久久视频| 国产成年精品| 免费一级欧美片在线观看网站| 日韩中文字幕无砖| 久久亚洲不卡| 日韩一区精品视频| 久色成人在线| 综合精品一区| 日韩av在线免费观看不卡| 亚洲a级精品| 日韩av一二三| 国产精品毛片久久久| 麻豆国产一区| 高清av一区| 久久伊人亚洲| 韩日一区二区| 国产精品久久观看| 都市激情国产精品| 免费人成在线不卡| 日韩在线欧美| 久久精品电影| 欧美另类中文字幕| 久久国产亚洲| 国产综合精品| 亚洲网站视频| 91精品日本| av一区二区高清| 久久国内精品自在自线400部| 中文字幕在线免费观看视频| 日本一区二区高清不卡| 狠狠久久伊人中文字幕| 亚洲图片久久| 91精品xxx在线观看| 青青在线精品| 亚洲精品中文字幕乱码| 麻豆免费精品视频| 在线免费观看亚洲| 99久久婷婷| 久久精品伊人| 亚洲精品裸体| 久久久久久久久丰满| 国产日韩视频| 国产精品一区二区三区美女| 亚洲激情精品| 久久成人高清| 人人爱人人干婷婷丁香亚洲| 2023国产精品久久久精品双| 麻豆国产欧美日韩综合精品二区| 国产精品美女午夜爽爽| 丝袜诱惑制服诱惑色一区在线观看| 国产精品国产一区| 欧美一级二区| 丝瓜av网站精品一区二区| 久久久久国产精品一区二区| 国产日产一区| 免费精品一区| 91麻豆精品| 日本欧美在线看| 99久久夜色精品国产亚洲狼| 国产精品久久久久久久久久齐齐 | 欧美女激情福利| 亚洲日本国产| 国产亚洲激情| 激情自拍一区| 麻豆精品蜜桃| 在线看片福利| 国产精品亚洲人成在99www | 极品裸体白嫩激情啪啪国产精品| 97精品在线| 欧美激情福利| 喷白浆一区二区| 五月精品视频| 另类中文字幕国产精品| 日韩欧美2区| 四虎精品永久免费| 久久夜色精品| 久久av一区| 国产精品日本| 你懂的国产精品| 国产精品亲子伦av一区二区三区| 亚州精品视频| 日韩高清不卡在线| 日韩高清在线观看一区二区| 亚洲精品日本| 亚洲精品福利| 日本欧洲一区二区| 老司机精品久久| 视频一区二区中文字幕| 韩国女主播一区二区三区| 亚洲色图国产| 亚洲精品一级二级三级| 日本综合视频| 欧美激情亚洲| 欧美aⅴ一区二区三区视频| 麻豆一区二区三区| 91亚洲国产高清| 亚洲欧洲高清| 99视频精品全国免费| 欧美日韩精品一区二区视频| 日韩午夜在线| 欧美美女一区| 国产极品一区| 免费在线观看一区| bbw在线视频| 国产日韩在线观看视频| 久久久亚洲欧洲日产| 国产成人调教视频在线观看| av免费不卡国产观看| 日本欧美不卡| 国产 日韩 欧美 综合 一区| 日日夜夜免费精品视频| 国产精品蜜月aⅴ在线| 精品三级久久久| 欧美精品日日操| 成人羞羞视频在线看网址| 麻豆91精品视频| 麻豆精品99| 国产综合精品| 97久久中文字幕| 国产成人精品一区二区三区在线| 国内精品伊人| 国产精品久久久久久久久久妞妞 | 日韩精品一二三四| 亚洲啊v在线| 欧美精品一二| 欧美日韩午夜电影网| 老司机精品视频网| 久久久9色精品国产一区二区三区| 亚洲综合二区| 1024精品久久久久久久久| 日本精品久久| 九色porny丨国产首页在线| 亚州av一区| 亚洲一级少妇| 欧美激情三区| 日韩一区二区三区免费播放| 欧美网站在线| 国产精品一国产精品k频道56| 国产 日韩 欧美一区| 久久一区精品| 日韩精品1区| 日韩综合小视频| 国精品一区二区三区| 亚洲涩涩av| 国产自产自拍视频在线观看| 1024精品久久久久久久久| 国产高清一区二区| 国产免费播放一区二区| 欧美1区免费| 国产精品极品国产中出| 日韩视频在线一区二区三区 | 欧美日韩国产观看视频| 国产一区成人| 国产成人精品亚洲线观看| 久久福利毛片| 狠狠久久伊人| 欧产日产国产精品视频| 欧美一级二级视频| 91久久中文| 最新中文字幕在线播放| 99pao成人国产永久免费视频| 国产九一精品| 日韩综合在线| 日本午夜精品视频在线观看| 五月天综合网站| 日产精品一区二区| 日本久久一区| 国产亚洲亚洲| 国产一区欧美| 首页国产精品| 国产日韩在线观看视频| 亚洲视频www| 日韩和欧美一区二区| 综合国产精品| 在线观看免费一区二区| 国产精品色婷婷在线观看| 日韩影院免费视频| 免费视频一区三区| 亚洲欧美不卡| 1024精品一区二区三区| 国产成人精品三级高清久久91| 日韩不卡手机在线v区| 免费观看日韩电影| 91精品亚洲| 午夜宅男久久久| 国产综合亚洲精品一区二| 中文在线免费视频| 欧美激情视频一区二区三区免费| 免费高清在线一区| 国产精品任我爽爆在线播放| 蜜桃传媒麻豆第一区在线观看 | 欧美一区二区三区免费看| 欧美日韩一区二区国产| 国产极品久久久久久久久波多结野| 亚洲欧美在线综合| 欧美在线综合| 亚洲精品网址| 久久精品亚洲人成影院 | 亚洲色图国产|