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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

徹底搞懂Java多線程(三)

瀏覽:201日期:2022-08-09 13:13:44
目錄Java線程池線程池的優(yōu)點(diǎn)線程池的6種創(chuàng)建方式創(chuàng)建單個(gè)線程池的作用是什么?線程池的第七種創(chuàng)建方式ThreadPoolExecutor的執(zhí)行方式ThreadPoolExecutor的執(zhí)行流程線程池的終止線程池的狀態(tài)異步、同步1.Java 線程 同步與異步線程工廠總結(jié)Java線程池

線程的缺點(diǎn):

1.線程的創(chuàng)建它會(huì)開(kāi)辟本地方法棧、JVM棧、程序計(jì)數(shù)器私有的內(nèi)存,同時(shí)消耗的時(shí)候需要銷(xiāo)毀以上三個(gè)區(qū)域,因此頻繁的創(chuàng)建和銷(xiāo)毀線程比較消耗系統(tǒng)的資源。

2.在任務(wù)量遠(yuǎn)遠(yuǎn)大于線程可以處理的任務(wù)量的時(shí)候,不能很好的拒絕任務(wù)。

所以就有了線程池:

使用池化的而技術(shù)來(lái)管理和使用線程。

線程池的優(yōu)點(diǎn)

1.可以避免頻繁的創(chuàng)建和銷(xiāo)毀線程

2.可以更好的管理線程的個(gè)數(shù)和資源的個(gè)數(shù)。

3.線程池?fù)碛懈嗟墓δ埽热缇€程池可以進(jìn)行定時(shí)任務(wù)的執(zhí)行。

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

線程池的6種創(chuàng)建方式

一共有7種創(chuàng)建方式

創(chuàng)建方式一:

創(chuàng)建固定個(gè)數(shù)的線程池:

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) {//創(chuàng)建一個(gè)固定個(gè)數(shù)的線程池ExecutorService executorService = Executors.newFixedThreadPool(10);//執(zhí)行任務(wù)for (int i = 0; i < 10; i++) { executorService.execute(new Runnable() {@Overridepublic void run() { System.out.println('線程名' + Thread.currentThread().getName());} });} }}

徹底搞懂Java多線程(三)

那么如果執(zhí)行次數(shù)大于10次呢?

線程池不會(huì)創(chuàng)建新的線程,它會(huì)復(fù)用之前的線程。

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

那么如果只執(zhí)行兩個(gè)任務(wù)呢?它創(chuàng)建了是10個(gè)線程還是兩個(gè)線程呢?

我們可以使用Jconsole來(lái)看一看:

徹底搞懂Java多線程(三)

結(jié)果是只有2個(gè)線程被創(chuàng)建。

創(chuàng)建方式二:

創(chuàng)建帶有緩存的線程池:

適用于短期有大量的任務(wù)的時(shí)候使用

public class ThreadPoolDemo2 { public static void main(String[] args) {//創(chuàng)建帶緩存的線程池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多線程(三)

方式三:

創(chuàng)建執(zhí)行定時(shí)任務(wù)的線程池

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('執(zhí)行定時(shí)任務(wù)前的時(shí)間:' + new Date());scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() {System.out.println('執(zhí)行任務(wù)的時(shí)間:' + new Date()); }},1,2, TimeUnit.SECONDS); }}

徹底搞懂Java多線程(三)

執(zhí)行任務(wù)的四個(gè)參數(shù)的意義:

參數(shù)1:延遲執(zhí)行的任務(wù)

參數(shù)2:延遲一段時(shí)間后執(zhí)行

參數(shù)3:定時(shí)任務(wù)執(zhí)行的頻率

參數(shù)4:配合前兩個(gè)參數(shù)使用,是2、3參數(shù)的時(shí)間單位

還有兩種執(zhí)行的方法:

只會(huì)執(zhí)行一次的方法:

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

第三種的執(zhí)行方式:

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

那么這種的執(zhí)行方式和第一種的執(zhí)行方式有什么區(qū)別呢?

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

徹底搞懂Java多線程(三)

方式一:

徹底搞懂Java多線程(三)

方式三:

徹底搞懂Java多線程(三)

結(jié)論很明顯了:

第一種方式是以上一個(gè)任務(wù)的開(kāi)始時(shí)間+定時(shí)的時(shí)間作為當(dāng)前任務(wù)的開(kāi)始時(shí)間

第三種方式是以上一個(gè)任務(wù)的結(jié)束時(shí)間來(lái)作為當(dāng)前任務(wù)的開(kāi)始時(shí)間。

創(chuàng)建方式四:

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) {//創(chuàng)建單個(gè)執(zhí)行任務(wù)的線程池ScheduledExecutorService scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();System.out.println('執(zhí)行任務(wù)之前' + new Date());scheduledExecutorService.scheduleWithFixedDelay(new Runnable() { @Override public void run() {System.out.println('我是SingleThreadSchedule'+ new Date()); }},3,1, TimeUnit.SECONDS); }}

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

創(chuàng)建方式五:

創(chuàng)建單個(gè)線程的線程池

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) {//創(chuàng)建單個(gè)線程的線程池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多線程(三)

創(chuàng)建單個(gè)線程池的作用是什么?

1.可以避免頻繁創(chuàng)建和銷(xiāo)毀線程所帶來(lái)的性能的開(kāi)銷(xiāo)

2.它有任務(wù)隊(duì)列,可以存儲(chǔ)多余的任務(wù)

3.可以更好的管理任務(wù)

4.當(dāng)有大量的任務(wù)不能處理的時(shí)候,可以友好的執(zhí)行拒絕策略

創(chuàng)建方式六:

創(chuàng)建異步線程池根據(jù)當(dāng)前CPU來(lái)創(chuàng)建對(duì)應(yīng)個(gè)數(shù)的線程池

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多線程(三)

運(yùn)行結(jié)果為什么什么都沒(méi)有呢?

看下面的異步與同步的區(qū)別就知道了。

加上這個(gè)

徹底搞懂Java多線程(三)

就可以輸出結(jié)果了

徹底搞懂Java多線程(三)

線程池的第七種創(chuàng)建方式

前六種的創(chuàng)建方式有什么問(wèn)題呢?

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

2.工作任務(wù)量不可控(默認(rèn)的任務(wù)隊(duì)列的大小時(shí)Integer.MAX_VALUE),任務(wù)比較大肯會(huì)導(dǎo)致內(nèi)存的溢出。

所以就可以使用下面的創(chuàng)建線程池的方式了:

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多線程(三)

參數(shù)說(shuō)明:

徹底搞懂Java多線程(三)

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

注意事項(xiàng):最大的線程數(shù)要大于等于核心的線程數(shù)

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

五種拒絕策略

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

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

因?yàn)長(zhǎng)inkedBlockingDeque時(shí)FIFO的。

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

徹底搞懂Java多線程(三)

徹底搞懂Java多線程(三)

ThreadPoolExecutor的執(zhí)行方式

徹底搞懂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());//線程池的執(zhí)行方式一threadPoolExecutor.execute(new Runnable() { @Override public void run() {System.out.println('使用了execute()執(zhí)行了線程池'); }});//線程池的執(zhí)行方式二Future<String> futureTask =threadPoolExecutor.submit(new Callable<String>() { @Override public String call() throws Exception {return '使用submit(new Callable<>())執(zhí)行了線程池'; }});System.out.println(futureTask.get()); }}

無(wú)返回值的執(zhí)行方式

徹底搞懂Java多線程(三)

有返回值的執(zhí)行方式

徹底搞懂Java多線程(三)

ThreadPoolExecutor的執(zhí)行流程

當(dāng)任務(wù)量小于核心線程數(shù)的時(shí)候,ThreadPoolExecutor會(huì)創(chuàng)建線程來(lái)執(zhí)行任務(wù)

當(dāng)任務(wù)量大于核心的線程數(shù)的時(shí)候,并且沒(méi)有空閑的線程時(shí)候,且當(dāng)線程池的線程數(shù)小于最大線程數(shù)的時(shí)候,此時(shí)會(huì)將任務(wù)存

放到任務(wù)隊(duì)列中

如果任務(wù)隊(duì)列也被存滿(mǎn)了,且最大線程數(shù)大于線程池的線程數(shù)的時(shí)候,會(huì)創(chuàng)建新的線程來(lái)執(zhí)行任務(wù)。

如果線程池的線程數(shù)等于最大的線程數(shù),并且任務(wù)隊(duì)列也已經(jīng)滿(mǎn)了,就會(huì)執(zhí)行拒絕策略。👇

徹底搞懂Java多線程(三)

線程池的終止

shutdown()

線程池的任務(wù)會(huì)執(zhí)行完

shutdownNow()

立即終止線程池,線程池的任務(wù)不會(huì)執(zhí)行完

線程池的狀態(tài)

徹底搞懂Java多線程(三)

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

多線程并發(fā)時(shí),多個(gè)線程同時(shí)請(qǐng)求同一個(gè)資源,必然導(dǎo)致此資源的數(shù)據(jù)不安全,A線程修改了B線程的處理的數(shù)據(jù),而B(niǎo)線程又修改了A線程處理的數(shù)理。顯然這是由于全局資源造成的,有時(shí)為了解決此問(wèn)題,優(yōu)先考慮使用局部變量,退而求其次使用同步代碼塊,出于這樣的安全考慮就必須犧牲系統(tǒng)處理性能,加在多線程并發(fā)時(shí)資源掙奪最激烈的地方,這就實(shí)現(xiàn)了線程的同步機(jī)制

同步

A線程要請(qǐng)求某個(gè)資源,但是此資源正在被B線程使用中,因?yàn)橥綑C(jī)制存在,A線程請(qǐng)求不到,怎么辦,A線程只能等待下去

異步

A線程要請(qǐng)求某個(gè)資源,但是此資源正在被B線程使用中,因?yàn)闆](méi)有同步機(jī)制存在,A線程仍然請(qǐng)求的到,A線程無(wú)需等待同步的方式:

1.發(fā)送請(qǐng)求

2.等待執(zhí)行完成

3.有結(jié)果的返回

異步的方式

1.發(fā)請(qǐng)求

2.執(zhí)行完成

3.另一個(gè)線程異步處理

4.處理完成之后返回回調(diào)結(jié)果

顯然,同步最最安全,最保險(xiǎn)的。而異步不安全,容易導(dǎo)致死鎖,這樣一個(gè)線程死掉就會(huì)導(dǎo)致整個(gè)進(jìn)程崩潰,使用異步的機(jī)制,性能會(huì)有所提升

線程工廠

設(shè)想這樣一種場(chǎng)景,我們需要一個(gè)線程池,并且對(duì)于線程池中的線程對(duì)象,賦予統(tǒng)一的線程優(yōu)先級(jí)、統(tǒng)一的名稱(chēng)、甚至進(jìn)行統(tǒng)一的業(yè)務(wù)處理或和業(yè)務(wù)方面的初始化工作,這時(shí)工廠方法就是最好用的方法了

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('使用線程工廠設(shè)置的線程名:'+ Thread.currentThread().getName() + ' 使用線程工廠設(shè)置的線程的優(yōu)先級(jí)' + 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多線程(三)

總結(jié)

本篇文章就到這里了,希望可以對(duì)你有所幫助,也希望您能夠多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产亚洲夜色av网站| 日韩高清成人在线| 日本午夜精品久久久久| 国产毛片一区| 国产亚洲高清视频| 99国产精品私拍| 亚洲欧美日本视频在线观看| 中文久久精品| 最新国产精品视频| 欧美伊人久久| 欧美国产极品| 三上亚洲一区二区| 日韩在线免费| 合欧美一区二区三区| 宅男噜噜噜66国产日韩在线观看| 久久精品国语| 国产精品试看| 色8久久久久| 国产日韩一区二区三区在线| 国产极品久久久久久久久波多结野| 久久a爱视频| а√天堂中文在线资源8| 日韩一区二区三区在线免费观看| 久久国产亚洲| 亚洲一区不卡| 欧美在线首页| 精品久久网站| 不卡中文字幕| 亚洲aa在线| 久久精品女人| 久久久水蜜桃av免费网站| 国产精品美女| 国产女人18毛片水真多18精品| 狠狠久久伊人中文字幕| 91精品国产乱码久久久久久久| 爽好久久久欧美精品| 日本在线不卡视频| 国产精品2区| 今天的高清视频免费播放成人| 香蕉成人久久| 国产精品美女久久久久久不卡| 高清不卡亚洲| 蜜桃久久精品一区二区| 国产精品麻豆成人av电影艾秋| 久久91导航| 久久亚洲电影| 久久久久亚洲精品中文字幕| 激情综合亚洲| 国产日韩视频| 久久久久久久久久久9不雅视频| 免费在线成人网| 麻豆91精品91久久久的内涵| 欧美午夜精彩| 久久精品99久久久| 亚洲成人精品| 欧美三级第一页| 国产成人精品亚洲日本在线观看| 爽爽淫人综合网网站 | 精品黄色一级片| 亚洲五月婷婷| 国产精品中文| 日韩午夜高潮| 精品高清久久| 亚洲另类av| 免费在线小视频| 91精品国产自产精品男人的天堂| 国产亚洲一区二区手机在线观看 | 欧美日韩少妇| 国产精品白丝一区二区三区| 天堂日韩电影| 日韩一区二区三区在线看| 在线中文字幕播放| 日本精品在线播放| 欧美日韩激情在线一区二区三区| 久久精品99国产精品日本| 黄色不卡一区| 精品国产aⅴ| 日韩三级精品| 亚洲黄页一区| 日本在线高清| 国产精品一区二区三区四区在线观看 | 亚洲经典在线| 国产在线观看www| 国产精品亚洲欧美一级在线| 99精品视频在线观看免费播放| 日本aⅴ精品一区二区三区| 欧美日韩一区二区三区视频播放| 国产精品久久久久久av公交车| 亚洲综合电影一区二区三区| 日韩欧美一区二区三区在线视频| 日韩激情网站| 99在线精品视频在线观看| 国产精品成人a在线观看| 日韩福利视频网| 9久re热视频在线精品| 成人国产精品一区二区网站| 国产三级精品三级在线观看国产| 亚洲资源网站| 伊人成人在线视频| 视频福利一区| 国产 日韩 欧美一区| 久久精品国产福利| 国产精品伊人| 国产日韩一区二区三区在线| 亚洲综合福利| 免费观看日韩电影| 亚洲作爱视频| 欧美日韩国产亚洲一区| 成人自拍av| 亚洲黄色免费看| 成人精品动漫一区二区三区| 日本视频在线一区| 视频精品一区| 石原莉奈在线亚洲二区| 久久精品影视| 电影亚洲精品噜噜在线观看| 国产精品久久观看| 精品精品国产三级a∨在线| 国产精品二区影院| 国产亚洲久久| 欧美日韩夜夜| 国产精品一区二区精品| 久久精品97| 国产精品日本一区二区不卡视频| 欧美一级一区| 91麻豆精品| 国产精选久久| 精品不卡一区| 日韩在线精品| 亚洲v在线看| 99国产精品| 亚洲精品婷婷| 国产午夜精品一区在线观看| 免费看久久久| 毛片在线网站| 亚洲天堂久久| 免费视频一区二区| 日本成人在线网站| 国产精品3区| 毛片在线网站| 丝袜av一区| 欧美亚洲国产激情| 伊人久久亚洲热| 亚洲精品国模| 国产日产精品一区二区三区四区的观看方式| 国产精品中文字幕制服诱惑| 久久精品国产久精国产爱| 高清不卡亚洲| 野花国产精品入口| 日韩精品视频一区二区三区| 国产精品一线天粉嫩av| 成人在线视频免费看| 久久久久久免费视频| 性一交一乱一区二区洋洋av| 日韩精品a在线观看91| 欧美国产专区| 欧美成人a交片免费看| 亚洲精品在线观看91| 亚洲视频二区| 另类综合日韩欧美亚洲| 捆绑调教日本一区二区三区| 欧美日韩国产高清电影| 亚洲精品少妇| 国产精品xx| 性欧美长视频| 国产欧美成人| 欧美日韩精品一区二区视频| 日韩中文字幕麻豆| 欧美激情亚洲| 亚洲午夜黄色| 91伊人久久| 国产美女高潮在线| 亚洲丝袜美腿一区| 国产精品成人a在线观看| 亚洲欧洲一区二区天堂久久| 91成人精品在线| 婷婷综合六月| 日本午夜精品| 999国产精品视频| 视频一区日韩| 美女一区网站| 亚洲欧美日韩国产综合精品二区| 国产精品巨作av| 国产精品99免费看| 国产欧美一区二区色老头| 99成人在线视频| 日韩精品一级| 欧美日中文字幕| 国产精品4hu.www| 国产麻豆综合| 97人人精品| 日韩国产欧美三级| 欧美日韩中文字幕一区二区三区| 日韩高清不卡一区| 欧美色图一区| 精品视频97| 男人的天堂亚洲一区| 激情综合五月| 综合亚洲色图| 日韩啪啪电影网|