一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java多線程學習筆記之自定義線程池

java多線程學習筆記之自定義線程池

2020-12-24 13:20eleven_yw Java教程

本篇文章主要介紹了java多線程學習筆記之自定義線程池 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

當我們使用 線程池的時候,可以使用 newcachedthreadpool()或者 newfixedthreadpool(int)等方法,其實我們深入到這些方法里面,就可以看到它們的是實現(xiàn)方式是這樣的。

java" id="highlighter_446627">
?
1
2
3
4
5
public static executorservice newcachedthreadpool() {
     return new threadpoolexecutor(0, integer.max_value,
                    60l, timeunit.seconds,
                    new synchronousqueue<runnable>());
}
?
1
2
3
4
5
public static executorservice newfixedthreadpool(int nthreads) {
     return new threadpoolexecutor(nthreads, nthreads,
                    0l, timeunit.milliseconds,
                    new linkedblockingqueue<runnable>());
 }

包括其他幾種不同類型的線程池,其實都是通過 threadpoolexecutor這個核心類來創(chuàng)建的,如果我們要自定義線程池,那么也是通過這個類來實現(xiàn)的。

java多線程學習筆記之自定義線程池

該類有四個構造方法,查看源碼可以看到,頭三個構造方法,其實都是調(diào)用的第四個構造方法,所以我們就解釋一下第四個構造方法的參數(shù)含義。

?
1
2
3
4
5
6
7
public threadpoolexecutor(int corepoolsize,
              int maximumpoolsize,
              long keepalivetime,
              timeunit unit,
              blockingqueue<runnable> workqueue,
              threadfactory threadfactory,
              rejectedexecutionhandler handler)

corepoolsize:核心線程池的大小,在線程池被創(chuàng)建之后,其實里面是沒有線程的。(當然,調(diào)用prestartallcorethreads()或者prestartcorethread()方法會預創(chuàng)建線程,而不用等著任務的到來)。當有任務進來的時候,才會創(chuàng)建線程。當線程池中的線程數(shù)量達到corepoolsize之后,就把任務放到 緩存隊列當中。(就是 workqueue)。

maximumpoolsize:最大線程數(shù)量是多少。它標志著這個線程池的最大線程數(shù)量。如果沒有最大數(shù)量,當創(chuàng)建的線程數(shù)量達到了 某個極限值,到最后內(nèi)存肯定就爆掉了。

keepalivetime:當線程沒有任務時,最多保持的時間,超過這個時間就被終止了。默認情況下,只有 線程池中線程數(shù)量 大于 corepoolsize時,keepalivetime值才會起作用。也就說說,只有在線程池線程數(shù)量超出corepoolsize了。我們才會把超時的空閑線程給停止掉。否則就保持線程池中有 corepoolsize 個線程就可以了。

unit:參數(shù)keepalivetime的時間單位,就是 timeunit類當中的幾個屬性。

如下圖:

java多線程學習筆記之自定義線程池

workqueue:用來存儲待執(zhí)行任務的隊列,不同的線程池它的隊列實現(xiàn)方式不同(因為這關系到排隊策略的問題)比如有以下幾種

arrayblockingqueue:基于數(shù)組的隊列,創(chuàng)建時需要指定大小。

linkedblockingqueue:基于鏈表的隊列,如果沒有指定大小,則默認值是 integer.max_value。(newfixedthreadpool和newsinglethreadexecutor使用的就是這種隊列)。

synchronousqueue:這種隊列比較特殊,因為不排隊就直接創(chuàng)建新線程把任務提交了。(newcachedthreadpool使用的就是這種隊列)。

threadfactory:線程工廠,用來創(chuàng)建線程。

handler:拒絕執(zhí)行任務時的策略,一般來講有以下四種策略,

(1) threadpoolexecutor.abortpolicy 丟棄任務,并拋出 rejectedexecutionexception 異常。

(2) threadpoolexecutor.callerrunspolicy:該任務被線程池拒絕,由調(diào)用 execute方法的線程執(zhí)行該任務。

(3) threadpoolexecutor.discardoldestpolicy : 拋棄隊列最前面的任務,然后重新嘗試執(zhí)行任務。

(4) threadpoolexecutor.discardpolicy,丟棄任務,不過也不拋出異常。

看一個demo ,示例代碼地址:src/thread_runnable/customthreadpool.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class customtask implements runnable{
  private int id;
  public customtask(int id) {
    this.id = id;
  }
 
  @override
  public void run() {
    // todo auto-generated method stub
    system.out.println("#" + id + "  threadid=" + thread.currentthread().getname() );
    try {
      timeunit.milliseconds.sleep(100);
    }catch(interruptedexception e){
      e.printstacktrace();
    }
  }
  
}
 
public class customthreadpool {
  public static void main(string[] args) {
    // todo auto-generated method stub
      blockingqueue<runnable> queue = new arrayblockingqueue<>(10);
      threadpoolexecutor pool = new threadpoolexecutor(3, 5, 60, timeunit.microseconds, queue);
      
      for (int i=0; i<7; i++){
        runnable task = new customtask(i);
        pool.execute(task);
      }
      
      pool.shutdown();
  }
 
}

輸出結果: 

 java多線程學習筆記之自定義線程池

從這個例子,可以看出,雖然我們有7個任務,但是實際上,只有三個線程在運行。

那么當我們提交任務給線程池之后,它的處理策略是什么呢?

java多線程學習筆記之自定義線程池

(1),如果當前線程池線程數(shù)目小于 corepoolsize(核心池還沒滿呢),那么就創(chuàng)建一個新線程去處理任務。

(2),如果核心池已經(jīng)滿了,來了一個新的任務后,會嘗試將其添加到任務隊列中,如果成功,則等待空閑線程將其從隊列中取出并且執(zhí)行,如果隊列已經(jīng)滿了,則繼續(xù)下一步。

(3),此時,如果線程池線程數(shù)量 小于 maximumpoolsize,則創(chuàng)建一個新線程執(zhí)行任務,否則,那就說明線程池到了最大飽和能力了,沒辦法再處理了,此時就按照拒絕策略來處理。(就是構造函數(shù)當中的handler對象)。

(4),如果線程池的線程數(shù)量大于corepoolsize,則當某個線程的空閑時間超過了keepalivetime,那么這個線程就要被銷毀了,直到線程池中線程數(shù)量不大于corepoolsize為止。

舉個通俗易懂的例子,公司要設立一個項目組來處理某些任務,hr部門給的人員編制是10個人(corepoolsize)。同時給他們專門設置了一間有15個座位(maximumpoolsize)的辦公室。最開始的時候來了一個任務,就招聘一個人。就這樣,一個一個的招聘,招滿了十個人,不斷有新的任務安排給這個項目組,每個人也在不停的接任務干活。不過后來任務越來越多,十個人無法處理完了。其他的任務就只能在走廊外面排隊了。后來任務越來越多,走廊的排隊隊伍也擠不下。然后只好找找一些臨時工來幫助完成任務。因為辦公室只有15個座位,所以它們最多也就只能找5個臨時工??墒侨蝿找琅f越來越多,根本處理不完,那沒辦法,這個項目組只好拒絕再接新任務。(拒絕的方式就是 handler),最后任務漸漸的少了,大家都比較清閑了。所以就決定看大家表現(xiàn),誰表現(xiàn)不好,誰就被清理出這個辦公室(空閑時間超過 keepalivetime),直到 辦公室只剩下10個人(corepoolsize),維持固定的人員編制為止。

關于線程池,threadpoolexecutor還提供了一些需要注意的方法:

(1) shutdown(),平滑的關閉線程池。(如果還有未執(zhí)行完的任務,就等待它們執(zhí)行完)。

(2) shutdownnow()。簡單粗暴的關閉線程池。(沒有執(zhí)行完的任務也直接關閉)。

(3) setcorepoolsize()。設置/更改核心池的大小。

(4) setmaximumpoolsize(),設置/更改線程池中最大線程的數(shù)量限制。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/yaoxiaowen/p/6576898.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人日韩 | 五月色婷婷在线影院 | 美女沟厕撒尿全过程高清图片 | 久久99精品国产自在自线 | 婷婷综合在线 | 欧美三级不卡视频 | 国产成人精品日本亚洲网站 | 精品一区二区三区高清免费不卡 | 幸福草电视剧演员表介绍 | 韩国美女豪爽一级毛片 | 久久AV国产麻豆HD真实乱 | 国产成人久久精品区一区二区 | 激情视频图片小说qvdo | 日韩欧一级毛片在线播无遮挡 | 免费一级毛片在级播放 | 午夜小视频网站 | 公园吃女人奶野战视频 | 五月婷婷丁香在线视频 | 亚色九九九全国免费视频 | 久青草国产97香蕉在线视频 | 亚洲高清在线精品一区 | 欧美在线视频一区二区 | 国产麻豆精品原创 | 九九在线精品亚洲国产 | 天美网站传媒入口网址 | 日本高清视频在线的 | 日本成熟老妇xxxx | 高清国产激情视频在线观看 | 法国女佣系列在线播放 | 国产成人免费视频 | 国产小青蛙 | 短篇最污的乱淫伦小说全集 | 四虎在线精品观看免费 | 精品国产麻豆免费人成网站 | 久久人妻少妇嫩草AV无码 | 第一福利在线视频 | 成年人黄色录像 | 成年极品漫画在线观看 | 亚洲精品6久久久久中文字幕 | 免费观看欧美成人禁片 | 91短视频在线免费观看 |