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

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

Java 用兩個線程交替打印數字和字母

瀏覽:142日期:2022-08-15 08:44:09

前一段時間聽馬士兵老師講課,講到某公司的一個面試,兩個線程,其中一個線程輸出ABC,另一個線程輸出123,如何控制兩個線程交叉輸出1A2B3C,由于本人多線程掌握的一直不是很好,所以聽完這道題,個人感覺收獲良多,這是一個學習筆記。這道題有多種解法,不過有些屬于純炫技,所以只記錄常見的三種解法。首先看第一種

1. park 和 unpark

package cn.bridgeli.demo; import com.google.common.collect.Lists; import java.util.List;import java.util.concurrent.locks.LockSupport; /** * @author BridgeLi * @date 2021/2/6 16:14 */public class Thread_Communication_Park_Unpark { static Thread t1 = null; static Thread t2 = null; public static void main(String[] args) { final List<Integer> integers = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);final List<String> strings = Lists.newArrayList('A', 'B', 'C', 'D', 'E', 'F', 'G'); t1 = new Thread(() -> integers.forEach(item -> { System.out.print(item); LockSupport.unpark(t2); LockSupport.park();}), 't1'); t2 = new Thread(() -> strings.forEach(item -> { LockSupport.park(); System.out.print(item); LockSupport.unpark(t1);}), 't2'); t1.start();t2.start(); } }

這個是最簡單的實現方法,LockSupport.park() 使當前線程阻塞,而 LockSupport.unpark() 則表示喚醒一個線程,所以他需要一個參數,表示你要喚醒哪個線程,很好理解,也比較簡單。

2. synchronized、notify、wait

package cn.bridgeli.demo; import com.google.common.collect.Lists; import java.util.List; /** * @author BridgeLi * @date 2021/2/6 16:14 */public class Thread_Communication_Notify_Wait { public static void main(String[] args) { final Object o = new Object();final List<Integer> integers = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);final List<String> strings = Lists.newArrayList('A', 'B', 'C', 'D', 'E', 'F', 'G'); new Thread(() -> { synchronized (o) {integers.forEach(item -> { System.out.print(item); o.notify(); try {o.wait(); } catch (InterruptedException e) {e.printStackTrace(); }}); o.notify(); }}, 't1').start(); new Thread(() -> { synchronized (o) {strings.forEach(item -> { System.out.print(item); o.notify(); try {o.wait(); } catch (InterruptedException e) {e.printStackTrace(); }});o.notify(); }}, 't2').start(); }}

這是一個比較傳統的寫法,也是比較難理解的一個寫法,掌握了這種寫法之后,對 synchronized、notify、wait 的認識也會有一個新高度,下面就簡單解析一下這種寫法:

我們都知道 synchronized 是一把鎖,而鎖是什么?就是一個第三方的互斥的一個資源,所以 synchronized (o),就表示我們對 o 這個對象加鎖,是通過修改 o 的對象頭實現的,也就是兩個線程誰成功修改了 o 的對象頭,那么誰就拿到了這把鎖,然后就可以執行里面的相關邏輯,而沒有成功修改 o 的對象頭的線程,就只有進入到對象 o 的一個等待隊列,等待被系統調度執行(這是一個比較簡單的不是很準確說法,詳細過程,等我將來再寫一個文章想聊鎖升級的過程);然后就是 o.notify(),剛說過 synchronized (o) 一堆線程爭搶鎖,沒有搶到鎖的線程進入對象 o 的等待隊列,所以 o.notify() 含義就是從對象 o 的等待隊列中隨機叫醒一個線程,然后執行;最后是 o.wait() 的含義,他的含義也很簡單,就是當前線程放到對象 o 的等待隊列中,讓出 CPU。

通過這段描述,所以大家肯定也可以學習到經常遇到的三個問題是怎么回事:1. wait 是否占用 CPU 資源,因為進入了等待隊列,所以是不會占用的;2. 既然 notify、wait 是讓喚醒線程和讓線程進入等待的,為什么不是 Thread 類的方法,反而是 Object 的方法,因為 notify、wait 是配合 synchronized 一起使用的,不一定用在多線程中,他們控制的是 synchronized 鎖定的對象的等待隊列,而 synchronized 鎖定的對象,肯定是一個 Object,所以 notify、wait 比如是 Object 對象的方法;3. 關于 synchronized (o) 括號里面是一個對象實例、Class 對象、鎖定代碼塊、靜態變量等等區別,只要明白 synchronized 修改的是什么,這些區別就一目了然了,不再贅述。

最后要說明的一個問題是:循環外邊的 o.notify() 必不可少,有些同學寫的時候可能隨手就忘記了,或者不知道為什么需要最后再 notify 一下,其實仔細想一想就可以明白了,假設最后執行的是輸出字母的線程,那么他之前一定是被執行輸出數字的線程喚醒的,而執行輸出數字的這個線程喚醒執行輸出字母的線程之后,自身就進入等待隊列了,所以循環結束之后,如果最后執行輸出字母的線程沒有喚醒執行輸出數字的線程的話,那么執行輸出數字的線程會一直 wait 阻塞在那里,將等到天荒地來海枯石爛永遠無法結束。

3. Condition

package cn.bridgeli.demo; import com.google.common.collect.Lists; import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * @author BridgeLi * @date 2021/2/6 16:14 */public class Thread_Communication_Condition { public static void main(String[] args) { final List<Integer> integers = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);final List<String> strings = Lists.newArrayList('A', 'B', 'C', 'D', 'E', 'F', 'G'); Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition(); new Thread(() -> { lock.lock(); try {integers.forEach(item -> { System.out.print(item); condition2.signal(); try {condition1.await(); } catch (InterruptedException e) {e.printStackTrace(); }}); condition2.signal(); } finally {lock.unlock(); }}, 't1').start(); new Thread(() -> { lock.lock(); try {strings.forEach(item -> { System.out.print(item); condition1.signal(); try {condition2.await(); } catch (InterruptedException e) {e.printStackTrace(); }});condition1.signal(); } finally {lock.unlock(); }}, 't2').start(); } }

當我們理解了上面兩種寫法之后,那么最后這個寫法其實也比較容易理解了,就不用我多贅言了。

如果有幸有同學看到了這里,那么我再提出一個小問題,可以思考一下怎么解決,后面兩種寫法,我們保證是執行輸出數字的線程還是執行輸出字母的線程先執行,也就是先輸出數字或者字母嗎?如果不能的話,現在業務需求要求必須是先輸出字母或者數字怎么做?(提示:CAS 自旋)

以上就是Java 用兩個線程交替打印數字和字母的詳細內容,更多關于Java 線程交替打印的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀91精品一区二区三区| 亚洲狼人精品一区二区三区| 久久99性xxx老妇胖精品| 亚洲欧美综合| 亚洲美洲欧洲综合国产一区| 丝袜美腿成人在线| 日韩1区2区日韩1区2区| 欧美一区91| 国产一区三区在线播放| 亚洲午夜av| 亚洲专区视频| 精品视频自拍| 中文字幕系列一区| 久久国产福利| 国产精品啊啊啊| 99精品在线| 亚洲精品影视| 精品一级视频| 精品高清久久| 啪啪国产精品| 亚洲香蕉久久| 精品色999| 亚洲一区欧美二区| 久久的色偷偷| 亚洲综合精品| 精品中文字幕一区二区三区 | 蜜桃av一区二区三区电影| 久久亚洲二区| 国产精品久久久久9999高清| 中文字幕系列一区| 日本伊人久久| 日本va欧美va欧美va精品| 蜜桃91丨九色丨蝌蚪91桃色| 久久99视频| 久久久久一区| 91国内精品| 99精品视频精品精品视频| 久久国产日韩欧美精品| 激情婷婷综合| 久久精品免视看国产成人| 免费一区二区视频| 午夜精品成人av| 国产精品tv| 亚洲免费福利一区| 欧美一区久久久| 亚洲精品在线国产| 激情中国色综合| 一二三区精品| 波多野结衣久久精品| 日韩欧乱色一区二区三区在线| 麻豆精品国产91久久久久久| 99精品在线观看| 麻豆91精品视频| 日韩在线观看中文字幕| 新版的欧美在线视频| 欧美日韩伊人| 午夜影院欧美| 欧美日韩亚洲三区| 夜夜精品视频| 欧美国产另类| 日日夜夜免费精品视频| 久久久久久一区二区| 亚洲乱码视频| 午夜在线播放视频欧美| 黑人精品一区| 国产精品亚洲综合久久| 亚洲三级观看| 99re国产精品| 日韩国产一区| 日本一二区不卡| 国产免费av一区二区三区| 亚洲网址在线观看| 国产婷婷精品| 国产偷自视频区视频一区二区| 国产欧美另类| 日韩精品五月天| 波多野结衣一区| 亚洲不卡系列| 高清不卡亚洲| 中文在线中文资源| 国产一区二区三区四区| 国产亚洲精aa在线看| 一本综合精品| 亚洲乱码一区| 日韩精品乱码av一区二区| 色综合视频一区二区三区日韩 | 精品国产一级| 国产亚洲精品精品国产亚洲综合 | 国产一区二区精品| 91精品国产自产在线观看永久∴ | 成人免费网站www网站高清| 日本综合精品一区| 国产美女撒尿一区二区| 一区二区日韩免费看| 视频在线在亚洲| 视频一区免费在线观看| 视频一区中文字幕| 日韩欧美一区二区三区免费观看| 亚洲精品少妇| 中文字幕在线视频网站| 高清av一区| 日本不卡免费高清视频在线| 精品国产乱码久久久| 精品女同一区二区三区在线观看| 天堂中文av在线资源库| 精品一区二区三区亚洲| 欧美影院视频| 国产精品一区2区3区| 亚洲精品少妇| 日本aⅴ精品一区二区三区 | 你懂的亚洲视频| 国产伦理久久久久久妇女| 日韩国产在线一| 免费中文字幕日韩欧美| 蜜臀久久99精品久久久画质超高清| 欧美日韩亚洲一区三区| 伊人久久大香伊蕉在人线观看热v| 日本午夜大片a在线观看| 桃色av一区二区| 午夜久久99| 日韩av一区二区三区| 精品一区二区三区免费看| 日韩电影免费网站| 亚洲一区观看| 欧美日韩一区二区国产| 精品三级在线| 欧美激情亚洲| 国产精品极品| 国产传媒av在线| 亚洲国内欧美| 蜜臀va亚洲va欧美va天堂| 午夜在线精品| 久久国产精品美女| 久久精品国内一区二区三区水蜜桃| 日本大胆欧美人术艺术动态| 亚洲欧美高清| 亚洲视频二区| 激情中国色综合| 伊人成人在线视频| 欧美一区成人| 秋霞影视一区二区三区| 欧美天堂亚洲电影院在线观看| 捆绑调教美女网站视频一区 | 日韩精品诱惑一区?区三区| 999久久久精品国产| 欧美日韩国产亚洲一区| 欧美午夜网站| 一区二区三区四区日本视频| 黄色国产精品| 欧美国产另类| 免费观看久久av| 国产亚洲高清一区| 成人国产精品久久| 久久国产精品久久久久久电车| 麻豆传媒一区二区三区| 亚洲天堂一区二区| 亚洲精品护士| 国产精品白浆| 亚洲深夜av| 麻豆成人91精品二区三区| 亚洲欧美日韩高清在线| 欧美精品国产| 伊人影院久久| 国产suv精品一区二区四区视频 | 国产美女一区| 国产精品免费精品自在线观看| 亚洲狼人精品一区二区三区| 日本久久二区| 久久精品青草| 免费日韩成人| 伊人精品久久| 2023国产精品久久久精品双| 精品中国亚洲| 视频一区日韩| 国产亚洲在线观看| 日韩免费av| 国产极品嫩模在线观看91精品| 欧美aa国产视频| 国产精品欧美一区二区三区不卡| 日韩视频一区二区三区在线播放免费观看| 日韩久久精品网| 日韩一区二区三区精品视频第3页| 蜜桃一区二区三区在线| 日韩电影在线视频| 久久精品国产成人一区二区三区| 国产一区二区三区四区| 免费看欧美美女黄的网站| 成人看片网站| 91精品xxx在线观看| 精品亚洲精品| 嫩呦国产一区二区三区av| 亚洲不卡视频| 午夜一区在线| 精品免费av一区二区三区| 国产免费播放一区二区| 99在线|亚洲一区二区| 亚洲国产专区校园欧美| 国产一区一一区高清不卡| 国产高清亚洲| 国产图片一区|