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

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

徹底搞懂Java多線程(三)

瀏覽:202日期:2022-08-09 13:13:44
目錄Java線程池線程池的優點線程池的6種創建方式創建單個線程池的作用是什么?線程池的第七種創建方式ThreadPoolExecutor的執行方式ThreadPoolExecutor的執行流程線程池的終止線程池的狀態異步、同步1.Java 線程 同步與異步線程工廠總結Java線程池

線程的缺點:

1.線程的創建它會開辟本地方法棧、JVM棧、程序計數器私有的內存,同時消耗的時候需要銷毀以上三個區域,因此頻繁的創建和銷毀線程比較消耗系統的資源。

2.在任務量遠遠大于線程可以處理的任務量的時候,不能很好的拒絕任務。

所以就有了線程池:

使用池化的而技術來管理和使用線程。

線程池的優點

1.可以避免頻繁的創建和銷毀線程

2.可以更好的管理線程的個數和資源的個數。

3.線程池擁有更多的功能,比如線程池可以進行定時任務的執行。

4.線程池可以更友好的拒絕不能處理的任務。

線程池的6種創建方式

一共有7種創建方式

創建方式一:

創建固定個數的線程池:

package ThreadPoolDemo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * user:ypc; * date:2021-06-13; * time: 10:24; */public class ThreadPoolDemo1 { public static void main(String[] args) {//創建一個固定個數的線程池ExecutorService executorService = Executors.newFixedThreadPool(10);//執行任務for (int i = 0; i < 10; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println('線程名' + Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

那么如果執行次數大于10次呢?

線程池不會創建新的線程,它會復用之前的線程。

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

那么如果只執行兩個任務呢?它創建了是10個線程還是兩個線程呢?

我們可以使用Jconsole來看一看:

徹底搞懂Java多線程(三)

結果是只有2個線程被創建。

創建方式二:

創建帶有緩存的線程池:

適用于短期有大量的任務的時候使用

public class ThreadPoolDemo2 { public static void main(String[] args) {//創建帶緩存的線程池ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < 100; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println(Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

方式三:

創建執行定時任務的線程池

package ThreadPoolDemo;import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/** * user:ypc; * date:2021-06-13; * time: 11:32; */public class ThreadPoolDemo3 { public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);System.out.println('執行定時任務前的時間:' + new Date());scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() {System.out.println('執行任務的時間:' + new Date()); }},1,2, TimeUnit.SECONDS); }}

徹底搞懂Java多線程(三)

執行任務的四個參數的意義:

參數1:延遲執行的任務

參數2:延遲一段時間后執行

參數3:定時任務執行的頻率

參數4:配合前兩個參數使用,是2、3參數的時間單位

還有兩種執行的方法:

只會執行一次的方法:

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

第三種的執行方式:

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

那么這種的執行方式和第一種的執行方式有什么區別呢?

當在兩種執行的方式中分別加上sleep()之后:

徹底搞懂Java多線程(三)

方式一:

徹底搞懂Java多線程(三)

方式三:

徹底搞懂Java多線程(三)

結論很明顯了:

第一種方式是以上一個任務的開始時間+定時的時間作為當前任務的開始時間

第三種方式是以上一個任務的結束時間來作為當前任務的開始時間。

創建方式四:

package ThreadPoolDemo;import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/** * user:ypc; * date:2021-06-13; * time: 12:38; */public class ThreadPoolDemo4 { public static void main(String[] args) {//創建單個執行任務的線程池ScheduledExecutorService scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();System.out.println('執行任務之前' + new Date());scheduledExecutorService.scheduleWithFixedDelay(new Runnable() { @Override public void run() {System.out.println('我是SingleThreadSchedule'+ new Date()); }},3,1, TimeUnit.SECONDS); }}

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

創建方式五:

創建單個線程的線程池

package ThreadPoolDemo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * user:ypc; * date:2021-06-13; * time: 12:55; */public class ThreadPoolDemo5 { public static void main(String[] args) {//創建單個線程的線程池ExecutorService executorService = Executors.newSingleThreadExecutor();for (int i = 0; i < 20; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println('線程名 ' + Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

創建單個線程池的作用是什么?

1.可以避免頻繁創建和銷毀線程所帶來的性能的開銷

2.它有任務隊列,可以存儲多余的任務

3.可以更好的管理任務

4.當有大量的任務不能處理的時候,可以友好的執行拒絕策略

創建方式六:

創建異步線程池根據當前CPU來創建對應個數的線程池

package ThreadPoolDemo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * user:ypc; * date:2021-06-13; * time: 13:12; */public class ThreadPoolDemo6 { public static void main(String[] args) {ExecutorService executorService = Executors.newWorkStealingPool();for (int i = 0; i < 10; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println('線程名' + Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

運行結果為什么什么都沒有呢?

看下面的異步與同步的區別就知道了。

加上這個

徹底搞懂Java多線程(三)

就可以輸出結果了

徹底搞懂Java多線程(三)

線程池的第七種創建方式

前六種的創建方式有什么問題呢?

1.線程的數量不可控(比如帶緩存的線程池)

2.工作任務量不可控(默認的任務隊列的大小時Integer.MAX_VALUE),任務比較大肯會導致內存的溢出。

所以就可以使用下面的創建線程池的方式了:

package ThreadPoolDemo;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * user:ypc; * date:2021-06-13; * time: 15:05; */public class ThreadPoolDemo7 { private static int threadId = 0; public static void main(String[] args) {ThreadFactory threadFactory = new ThreadFactory() { @Override public Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setName('我是threadPool-' + ++threadId);return thread; }};ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 3, 100,TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(12),threadFactory, new ThreadPoolExecutor.AbortPolicy());for (int i = 0; i < 15; i++) { threadPoolExecutor.execute(new Runnable() {@Overridepublic void run() { System.out.println(Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

參數說明:

徹底搞懂Java多線程(三)

參數一:核心線程數|線程池正常情況下的線程 數量 參數二:最大線程數|當有大量的任務的時候可以創建的最多的線程數 參數三:最大線程的存活時間 參數四:配合參數三一起使用的表示參數三的時間單位 參數五:任務隊列 參數六:線程工廠 參數七:決絕策略

注意事項:最大的線程數要大于等于核心的線程數

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

五種拒絕策略

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

為什么拒絕策略可以舍棄最新的任務或者最舊的任務呢?

因為LinkedBlockingDeque時FIFO的。

第五種:自定義的拒絕策略

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

ThreadPoolExecutor的執行方式

徹底搞懂Java多線程(三)

package ThreadPoolDemo;import java.util.concurrent.*;/** * user:ypc; * date:2021-06-13; * time: 16:58; */public class ThreadPoolDemo9 { public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 4, 100,TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10), new ThreadPoolExecutor.DiscardOldestPolicy());//線程池的執行方式一threadPoolExecutor.execute(new Runnable() { @Override public void run() {System.out.println('使用了execute()執行了線程池'); }});//線程池的執行方式二Future<String> futureTask =threadPoolExecutor.submit(new Callable<String>() { @Override public String call() throws Exception {return '使用submit(new Callable<>())執行了線程池'; }});System.out.println(futureTask.get()); }}

無返回值的執行方式

徹底搞懂Java多線程(三)

有返回值的執行方式

徹底搞懂Java多線程(三)

ThreadPoolExecutor的執行流程

當任務量小于核心線程數的時候,ThreadPoolExecutor會創建線程來執行任務

當任務量大于核心的線程數的時候,并且沒有空閑的線程時候,且當線程池的線程數小于最大線程數的時候,此時會將任務存

放到任務隊列中

如果任務隊列也被存滿了,且最大線程數大于線程池的線程數的時候,會創建新的線程來執行任務。

如果線程池的線程數等于最大的線程數,并且任務隊列也已經滿了,就會執行拒絕策略。👇

徹底搞懂Java多線程(三)

線程池的終止

shutdown()

線程池的任務會執行完

shutdownNow()

立即終止線程池,線程池的任務不會執行完

線程池的狀態

徹底搞懂Java多線程(三)

異步、同步1.Java 線程 同步與異步

多線程并發時,多個線程同時請求同一個資源,必然導致此資源的數據不安全,A線程修改了B線程的處理的數據,而B線程又修改了A線程處理的數理。顯然這是由于全局資源造成的,有時為了解決此問題,優先考慮使用局部變量,退而求其次使用同步代碼塊,出于這樣的安全考慮就必須犧牲系統處理性能,加在多線程并發時資源掙奪最激烈的地方,這就實現了線程的同步機制

同步

A線程要請求某個資源,但是此資源正在被B線程使用中,因為同步機制存在,A線程請求不到,怎么辦,A線程只能等待下去

異步

A線程要請求某個資源,但是此資源正在被B線程使用中,因為沒有同步機制存在,A線程仍然請求的到,A線程無需等待同步的方式:

1.發送請求

2.等待執行完成

3.有結果的返回

異步的方式

1.發請求

2.執行完成

3.另一個線程異步處理

4.處理完成之后返回回調結果

顯然,同步最最安全,最保險的。而異步不安全,容易導致死鎖,這樣一個線程死掉就會導致整個進程崩潰,使用異步的機制,性能會有所提升

線程工廠

設想這樣一種場景,我們需要一個線程池,并且對于線程池中的線程對象,賦予統一的線程優先級、統一的名稱、甚至進行統一的業務處理或和業務方面的初始化工作,這時工廠方法就是最好用的方法了

package ThreadPoolDemo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;/** * user:ypc; * date:2021-06-13; * time: 11:12; */public class ThreadFactoryDemo { public static void main(String[] args) {MyThreadFactory myThreadFactory = new MyThreadFactory();ExecutorService executorService = Executors.newFixedThreadPool(10,myThreadFactory);for (int i = 0; i < 10; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println('使用線程工廠設置的線程名:'+ Thread.currentThread().getName() + ' 使用線程工廠設置的線程的優先級' + Thread.currentThread().getPriority());} });} } private static int count = 0; static class MyThreadFactory implements ThreadFactory{ @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setPriority(8); thread.setName('thread--' + count++); return thread; } }}

徹底搞懂Java多線程(三)

總結

本篇文章就到這里了,希望可以對你有所幫助,也希望您能夠多多關注好吧啦網的更多內容!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜日本精品| 日韩一区免费| 久久不见久久见国语| 日本精品国产| 91欧美精品| 国产精品一国产精品| 国产精品日韩精品在线播放| 国产欧美一区二区三区精品观看| 蜜桃免费网站一区二区三区| www.51av欧美视频| 在线天堂资源www在线污| 伊人网在线播放| 欧美成人精品三级网站| 99精品综合| 香蕉久久久久久久av网站| 妖精视频成人观看www| 亚洲天堂日韩在线| 国产剧情在线观看一区| 精品国内亚洲2022精品成人| 97精品一区二区| 欧美理论视频| 亚洲人www| 国产精品sm| 日韩一区三区| 在线国产一区二区| 日韩在线观看中文字幕| 欧美精品不卡| 亚洲h色精品| 亚洲最新av| 国产精品99久久免费| 国产v日韩v欧美v| 亚洲国产日韩欧美在线| 亚洲精品精选| 成人台湾亚洲精品一区二区| 久久精品国产亚洲夜色av网站| 欧美另类中文字幕 | 欧美国产极品| 都市激情国产精品| 亚洲一区中文| 国产精品自在| 色一区二区三区| 丝瓜av网站精品一区二区| 欧美精品影院| 日韩免费小视频| 蜜臀久久久久久久| 精品一区二区三区免费看 | 亚洲免费网址| 欧美日韩一区二区国产| 国产精品蜜芽在线观看| 一区免费视频| 欧美国产专区| 亚洲性色视频| 欧美精品国产白浆久久久久| 亚洲午夜天堂| 亚洲aa在线| 欧洲精品一区二区三区| 日韩精品国产精品| 91看片一区| 日韩av网站免费在线| 日韩伦理在线一区| 日韩av在线播放中文字幕| 久久天堂精品| 国产免费久久| 激情91久久| 国产aⅴ精品一区二区三区久久 | 91tv亚洲精品香蕉国产一区| 丝袜国产日韩另类美女| 欧美经典一区| 久久高清一区| 日韩亚洲一区在线| 欧美日韩亚洲一区在线观看| 免费视频国产一区| 麻豆精品在线观看| 亚洲三区欧美一区国产二区| 精品免费av在线| 国产伦理一区| 亚洲综合日韩| 久久国产电影| 久久精品五月| 人人爱人人干婷婷丁香亚洲| 婷婷精品进入| 国产中文字幕一区二区三区| 奇米狠狠一区二区三区| 黑丝一区二区三区| 日韩一区三区| 精品视频97| 国产丝袜一区| 亚洲视频国产精品| 欧美精品一线| 国产成人精品亚洲日本在线观看| 欧美精品羞羞答答| 久久久国产精品网站| 亚洲精品系列| 五月精品视频| 日韩在线观看一区| 精品一区视频| 国产精品多人| 亚洲精选成人| 亚洲欧美视频| 一级欧洲+日本+国产| 天堂网av成人| 国产成人精品一区二区三区免费| 亚洲精品一区二区在线看| 精品精品99| 欧美午夜三级| 在线看片日韩| 久久超级碰碰| 99国产一区| 免费视频最近日韩| 亚洲欧美日韩高清在线| 久久久9色精品国产一区二区三区| 欧美中文一区二区| 日本一区二区三区中文字幕| 亚洲激情黄色| 午夜国产精品视频| 女人天堂亚洲aⅴ在线观看| 九一精品国产| 在线观看免费一区二区| 午夜精品免费| 亚洲欧美久久久| 蜜桃av一区二区| 视频一区二区三区入口| 久久av一区二区三区| 国产亚洲激情| 在线视频免费在线观看一区二区| 青青国产91久久久久久| 亚洲人成网站在线在线观看| 一级成人国产| 亚洲精品中文字幕99999| 亚州av日韩av| 日韩高清成人在线| 香蕉久久久久久| 亚洲精品国模| 日韩动漫一区| 国产激情综合| 日韩不卡一区| 成人免费电影网址| 午夜国产精品视频免费体验区| 国产精品亚洲片在线播放| 日欧美一区二区| 91九色综合| 精品国产亚洲日本| 日本蜜桃在线观看视频| 激情综合网五月| 中文字幕av亚洲精品一部二部 | 亚洲精品国产精品粉嫩| 亚洲涩涩av| 国产精品久久久久久久久久白浆| 午夜电影亚洲| 蜜臀精品一区二区三区在线观看| 国产三级精品三级在线观看国产| 日韩中文字幕一区二区高清99| 日韩电影二区| 久久免费大视频| 免播放器亚洲| 中文字幕av亚洲精品一部二部| 99精品在线观看| 99国产精品| 日本一不卡视频| 精品日韩一区| 久久国产直播| 日韩在线a电影| 国产精品亚洲综合色区韩国| 在线亚洲人成| 亚洲色图国产| 国产精品视频3p| 日韩在线不卡| 亚洲午夜免费| 久久影院资源站| 欧美在线资源| 国产麻豆精品久久| 久久久久久久久久久妇女| 丝袜亚洲另类欧美| 国产福利亚洲| 亚洲一级网站| 日韩国产欧美视频| 国产精品久久久久蜜臀| 香蕉久久夜色精品国产| 国产福利资源一区| 中日韩男男gay无套| 久久激五月天综合精品| 91嫩草亚洲精品| 亚洲三区欧美一区国产二区| 精品国产乱码久久久久久樱花| 日韩精品久久理论片| 国产精品久久久久久久久免费高清 | 精品久久中文| 九九综合在线| 麻豆成人综合网| 精品1区2区3区4区| 精品国产一区二| 视频一区二区国产| 日韩国产一区| 亚洲精品第一| 久久久成人网| 国产精品网站在线看| 午夜电影亚洲| 不卡专区在线| 日韩一区二区三区免费视频| 久久男女视频|