Java中有幾種線程池

這篇文章主要講解了“Java中有幾種線程池”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中有幾種線程池”吧!

成都創新互聯成立于2013年,先為茌平等服務建站,茌平等地企業,進行企業商務咨詢服務。為茌平企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

線程池,顧名思義,放線程的池子嘛,這個池子可以存放多少線程取決于你自己采用什么樣的線程池,你的硬件資源,以及并發線程的數量。JDK提供了下面的四種線程池:

固定線程數的線程池
  1.  最簡單的

在Java中創建一個線程池,這很簡單,只需要兩行代碼。

ExecutorService executor = Executor.newFixedTreadPool(6);//固定線程是6//線程一般設置成processor核心數的倍數,因為我這臺機器是6核的,所以設成6。這也是充分利用硬件嘛
//執行線程任務executor.execute(new Runnable(){@Overridepublic void run(){     //do nothing }})    executor.shutdown();

Executor是Java并發包中提供的,用來創造不同類型的線程池。

Attention

但是在多人合作或者是一些部署上線的項目里,是不允許去使用這種方法的,因為它是有性能隱患的。

Executors在創建線程池的時候,用的是new LinkedBlockingQueue(),它這個隊列本身是無邊界的,但是線程是固定數量的。這就意味著,在程序運行的過程中,最多會有N個線程在處于活動狀態。每次有新的任務來就會等待,直到有線程處于空閑狀態。所有的線程都會處于線程池里里面,直到shutdown()的執行。

它的問題就在于來者不拒,只要有任務來,你就進隊列等著。在入隊列和出隊列用的并不是同一個lock,在多processor的機器上,是可以做到真正意義上的并行的。拿經典的生產者和消費者來舉例子,在同一個時間點,有的在消費,有的在生產。

這種線程池不會銷毀線程,不會拒絕任務,固定線程數。所以如果不停的加入任務,會導致很糟糕的內存占用,老年代可能會被占滿。

  1.  稍復雜的(可以延時執行,也可以執行帶返回值的任務)

public static void main(String[] args) throws InterruptedException, ExecutionException {        TestThread testThread = new TestThread();        System.out.println(testThread.processors);
       ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(6);        FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {            @Override            public String call() throws Exception {                return Thread.currentThread().getName();            }        });        scheduledExecutorService.submit(futureTask);
       //獲取返回值        String result = futureTask.get();        System.out.println("result :"+result);
       //執行延時任務        scheduledExecutorService.schedule(new Runnable() {            @Override            public void run() {                System.out.println(Thread.currentThread().getName()+": bomb!");            }        },3L,TimeUnit.SECONDS);    }

Output:

result :pool-1-thread-1
pool-1-thread-1: bomb!

緩存的線程池

核心池大小為0,線程池最大線程數目為最大整型,這意味著所有的任務一提交就會wait。當線程池中的線程有60s沒有執行任務就會被Kill,阻塞隊列為SynchronousQueue。SynchronousQueue的take操作需要put操作等待,put操作需要take操作等待,否則會阻塞(線程池的阻塞隊列不能存儲,所以當目前線程處理忙碌狀態時,會開辟新的線程來處理請求**),線程進入wait set。

總結一下這是一個可以無限擴大的線程池;適合處理執行時間比較小的任務;線程空閑時間超過60s就會被Kill,所以長時間處于空閑狀態的時候,這種線程池幾乎不占用資源,因為它壓根沒有線程在里面;阻塞隊列沒有存儲空間,只要請求到來,就必須找到一條空閑線程去處理這個請求,找不到則在線程池新開辟一條線程。

如果主線程提交任務的速度遠遠大于CachedThreadPool的處理速度,則CachedThreadPool會不斷地創建新線程來執行任務,這樣有可能會導致系統耗盡CPU和內存資源,所以在使用該線程池時,要注意控制并發的任務數。如果是一個不斷增長的任務需求,很容易就會到性能瓶頸,它會不停的創建新的線程。

 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();        for (int i = 0; i < 10; i++) {            cachedThreadPool.execute(new Runnable() {                @Override                public void run() {                    System.out.println(Thread.currentThread().getName());                }            });        }        cachedThreadPool.shutdown();

Output:

pool-1-thread-2
pool-1-thread-6
pool-1-thread-1
pool-1-thread-7
pool-1-thread-8
pool-1-thread-3
pool-1-thread-5
pool-1-thread-9
pool-1-thread-4
pool-1-thread-10

單個線程的線程池

SingleThreadExecutor 是使用單個worker線程的Executor。只有一種情況會有新的線程加入線程池,那就是原有的線程運行時有拋出異常,這時就會有創建的新的線程來替代它的工作。

拿生產者消費者模型來說的話,這就是一個單一消費者的模型

(ps.一般可以用來做一些日志記錄

 public static void main(String[] args) {        // 永遠是一條線程        ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();        for (int i = 0; i < 10; i++) {            final int j = i;            singleThreadPool.execute(new Runnable() {                @Override                public void run() {                    System.out.println(Thread.currentThread().getName() + ":" + j);                }            });        }        singleThreadPool.shutdown();            }

Output:

pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9

感謝各位的閱讀,以上就是“Java中有幾種線程池”的內容了,經過本文的學習后,相信大家對Java中有幾種線程池這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

網頁題目:Java中有幾種線程池
新聞來源:http://m.kartarina.com/article48/pihhep.html

成都網站建設公司_創新互聯,為您提供面包屑導航網站策劃商城網站定制開發定制網站域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設
主站蜘蛛池模板: 无码内射中文字幕岛国片| 亚洲中文字幕无码一区二区三区| 夜夜添无码一区二区三区| 国产精品三级在线观看无码| 亚洲av无码av在线播放| 亚洲国产AV无码专区亚洲AV | 久久久久亚洲Av无码专| 无码人妻丰满熟妇区五十路| 免费无码黄网站在线看| 无码一区18禁3D| 伊人久久精品无码麻豆一区| 中日精品无码一本二本三本| 免费A级毛片无码A∨男男| 精品国产V无码大片在线看| 无码专区狠狠躁躁天天躁| 日韩AV无码一区二区三区不卡毛片| 99久久国产热无码精品免费| 无码国内精品久久人妻| 日韩a级无码免费视频| 亚洲精品无码你懂的网站| 无码精品不卡一区二区三区 | 国产色无码精品视频国产| 久久精品亚洲中文字幕无码麻豆 | 亚洲a∨无码男人的天堂| 亚洲精品无码午夜福利中文字幕 | 无码人妻丝袜在线视频| 男人的天堂无码动漫AV| 亚洲AV无码精品色午夜果冻不卡 | 午夜人性色福利无码视频在线观看| av无码精品一区二区三区四区| 成人免费无遮挡无码黄漫视频| 亚洲AV无码男人的天堂| 亚洲AV无码一区二区三区电影| 亚洲国产精品无码久久久秋霞1| 亚洲成A∨人片在线观看无码| 久久久久亚洲av无码专区导航| 白嫩少妇激情无码| 国产精品无码久久综合网| 内射中出无码护士在线| 中文字幕无码第1页| 久久亚洲AV成人无码软件|