精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試題:三個線程按順序打印 ABCABC

開發 前端
LockSupport 我也是第一次用,它使用起來也很方便,就單純的 阻塞和喚醒線程 ,對應 park 和 unPark 方法。

小伙伴們好呀,最近在重新復習,整理自己的知識庫,偶然看到這道面試題:三個線程按順序打印 ABCABC,嘗試著做一下,才發現自己對線程還有好多地方不懂,藍瘦…… ??

思路

很明顯,這里就涉及線程間相互通信的知識了。

而相互通信的難點就是要控制好,阻塞和喚醒的時機。

一. 這里就是 A 通知 B,B 通知 C , C 通知 A

圖片

二. 三個線程在等待(阻塞)和喚醒(執行) 中不斷切換。

三. 等待的方式大致分為兩種

  • wait 方法  (Object native 方式 )
  • LockSupport.park 方式 ( Unsafe native 方式 )

四. 喚醒的方式

  • notify,notifyAll 方法  (Object native 方式 )
  • LockSupport.unPark 方式 ( Unsafe native 方式 )

五. 互斥條件

線程 A 先拿到資源 c,再拿資源 a ,[a 執行完后釋放,并喚醒等待資源 a]  的 線程 B 線程 B 先拿到資源 a,再拿資源 b ,[b 執行完后釋放,并喚醒等待資源 b]  的 線程 C 線程 C 先拿到資源 b,再拿資源 c ,[c 執行完后釋放,并喚醒等待資源 c]  的 線程 A

所以得有 三個 共享資源 abc 來達到互斥條件

Synchronized 還是 ReentrantLock 都得建立 三個共享資源

圖片

六. 擴展 

使用 LockSupport ,如果要像上面這樣子的思路去解答,就得注意 線程相互引用行成的循環依賴問題,這里借用 Spring 的思路 用 Map 巧妙化解。 

或者做法2 通過 外部的成員變量,不斷地去判斷,unpark 線程 a b c

Synchronized 方式

private static class MySynchronized {

void printABC() throws InterruptedException {

class MyRunable implements Runnable {

private Object lock1;
private Object lock2;
private CountDownLatch countDownLatch;

public MyRunable(Object lock1, Object lock2){
this.lock1 = lock1;
this.lock2 = lock2;
}

public MyRunable(Object lock1, Object lock2, CountDownLatch countDownLatch){
this.lock1 = lock1;
this.lock2 = lock2;
this.countDownLatch = countDownLatch;
}

@Override
public void run(){
boolean running = false;

int count = 2;
while (count > 0) {
// C,A - > A 喚醒 B 線程
// A,B - > B 喚醒 C 線程
// B,C - > C 喚醒 A 線程 (最后一次執行時,喚醒 A 后,A 發現 count =0,就不執行了。
synchronized (lock1) {

synchronized (lock2) {
System.out.println(Thread.currentThread().getName());
count--;
// lock2 方法塊執行結束前,喚醒其他線程。
lock2.notify();
}
// 線程執行完畢后
if (countDownLatch != null && !running) {
countDownLatch.countDown();
running = true;
}

try {
// 釋放鎖
lock1.wait();
} catch (InterruptedException e) {
}

}

}
System.out.println(Thread.currentThread().getName() + " over");
synchronized (lock2) {
// 喚醒其他線程。
lock2.notify();
}
}
}

CountDownLatch countDownLatch = new CountDownLatch(1);
CountDownLatch countDownLatch2 = new CountDownLatch(1);

Object a = new Object();
Object b = new Object();
Object c = new Object();

MyRunable ra = new MyRunable(c, a, countDownLatch);
MyRunable rb = new MyRunable(a, b, countDownLatch2);
MyRunable rc = new MyRunable(b, c);


Thread a1 = new Thread(ra, "A");
a1.start();

countDownLatch.await();

Thread b1 = new Thread(rb, "B");
b1.start();

countDownLatch2.await();

Thread c1 = new Thread(rc, "C");
c1.start();


}
}

這里我借用 countDownLatch 去控制線程的啟動流程,盡量不使用 Thread.sleep() 來實現,拿捏線程的執行,通信步驟。

寫這個的時候,除了一開始思路不清晰外,還出現一個小狀況,就是 程序執行完卡住了。

圖片

debug 發現線程 B C 還在 wait 狀態,這是寫時候容易疏忽的。

要記得在循環外再次喚醒其他線程,讓他們走完方法。

圖片

ReentrantLock 方式

private static class MyReentrantLock {

int number = 6;

void printABC(){
ReentrantLock lock = new ReentrantLock();

Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();


class MyRunnable implements Runnable {

ReentrantLock lock;
Condition condition1;
Condition condition2;


public MyRunnable(ReentrantLock lock, Condition condition1, Condition condition2){
this.lock = lock;
this.condition1 = condition1;
this.condition2 = condition2;
}

@Override
public void run(){
int count = 2;
while (count > 0) {
lock.lock();
try {
String name = Thread.currentThread().getName();

if (
number % 3 != 0 && "A".equals(name)
|| number % 3 != 2 && "B".equals(name)
|| number % 3 != 1 && "C".equals(name)
) {
condition1.await();
}
System.out.println(name + " : " + number);
number--;
count--;
condition2.signal();

} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();

}
}

}
}


new Thread(new MyRunnable(lock, conditionC, conditionA), "A").start();

new Thread(new MyRunnable(lock, conditionA, conditionB), "B").start();

new Thread(new MyRunnable(lock, conditionB, conditionC), "C").start();

}
}

Synchronized 會了之后,這個也很簡單了。

就是上鎖的地方換成 lock.lock();,把三個共享資源換成 lock.newCondition();

然后思考一下阻塞條件 condition1.await() 。

畢竟 打印 和 喚醒 的操作總是在一起的。

圖片

Semaphore 我也寫了,但是感覺不太適合,畢竟它的作用是用來控制并發線程數的,我直接創建三個 Semaphore  總覺得怪怪的。??

LockSupport 方式

這里我寫了兩種方法

private static class MyLockSupport {
volatile int number = 6;

void printABC() throws InterruptedException {
class MyRunnable implements Runnable {

@Override
public void run(){
int count = 2;
while (count > 0) {
LockSupport.park(this);
System.out.println(Thread.currentThread().getName());
count--;
}
}
}
Thread a = new Thread(new MyRunnable(), "A");
Thread b = new Thread(new MyRunnable(), "B");
Thread c = new Thread(new MyRunnable(), "C");

a.start();
b.start();
c.start();


while (number > 0) {
if (number % 3 == 0) {
LockSupport.unpark(a);
} else if (number % 3 == 2) {
LockSupport.unpark(b);
} else {
LockSupport.unpark(c);
}
number--;
LockSupport.parkNanos(this, 200 * 1000);
// LockSupport.parkUntil(this,System.currentTimeMillis()+3000L);
}

}

// 用 map 解決線程循環依賴的問題
void printABC2() throws InterruptedException {

class MyRunnable implements Runnable {

Map<String, Thread> map;

public MyRunnable(Map<String, Thread> map){
this.map = map;
}

@Override
public void run(){
int count = 2;

String name = Thread.currentThread().getName();
String key = "A".equals(name) ? "B" : "B".equals(name) ? "C" : "A";

while (count > 0) {
if (
number % 3 == 0 && "A".equals(name)
|| number % 3 == 2 && "B".equals(name)
|| number % 3 == 1 && "C".equals(name)
) {

System.out.println(name);
count--;
number--;
LockSupport.unpark(map.get(key));
}
LockSupport.park(this);
}

LockSupport.unpark(map.get(key));

}

}

Map<String, Thread> map = new HashMap<>();


Thread a = new Thread(new MyRunnable(map), "A");
Thread b = new Thread(new MyRunnable(map), "B");
Thread c = new Thread(new MyRunnable(map), "C");

map.put("A", a);
map.put("B", b);
map.put("C", c);

a.start();
b.start();
c.start();


}
}

LockSupport 我也是第一次用,它使用起來也很方便,就單純的 阻塞和喚醒線程 ,對應 park 和 unPark 方法。

它不要求你像 wait 那樣子,必須寫在 Synchronized 代碼塊里,被 Monitor 監視才行。

但同時,也意味著你必須控制好這個 鎖的范圍 。

你可以自由阻塞代碼,在具備某個條件時,喚醒特定的線程,讓它繼續執行。

實際上,上面 ReentrantLock 中的 Condition await 方法,底層就是調用 LockSupport 的 park 方法。

這也是我開頭說的通信大致分為兩種方式的原因。

方法一中,我是用 parkNanos 阻塞一段時間,然后就繼續運行,也算是取巧不用 Thread.Sleep 了吧??

方法二 我比較喜歡,思路也是同開頭兩種,打印完喚醒其他線程。

責任編輯:武曉燕 來源: Java4ye
相關推薦

2015-09-02 09:32:56

java線程面試

2024-09-05 13:02:41

2020-10-05 21:46:54

線程

2022-01-04 09:59:45

面試題字節存儲

2020-06-04 14:40:40

面試題Vue前端

2023-11-13 07:37:36

JS面試題線程

2023-06-25 08:38:09

多線程循環打印

2011-03-24 13:27:37

SQL

2011-06-07 08:55:25

2017-08-29 14:12:16

Java面試題

2015-08-27 09:27:34

JavaScript面試題

2014-12-02 10:02:30

2010-08-30 20:51:15

名企面試題

2023-07-28 08:04:56

StringHeaatomic線程

2019-03-23 20:00:04

面試react.js前端

2009-06-06 18:36:02

java面試題

2009-06-06 18:34:05

java面試題

2014-09-19 11:17:48

面試題

2021-06-02 12:12:46

DevOps面試Linux

2011-07-18 15:08:19

SQL存儲過程
點贊
收藏

51CTO技術棧公眾號

精品白丝av| 国产免费拔擦拔擦8x在线播放 | av一区二区三区免费观看| www香蕉视频| 久久久久看片| 欧美成人黑人xx视频免费观看| 师生出轨h灌满了1v1| 樱花草涩涩www在线播放| 国产精品网站在线观看| 岛国视频一区免费观看| 欧美超碰在线观看| 狠狠88综合久久久久综合网| 亚洲无限av看| 日韩精品国产一区| julia一区二区三区中文字幕| 一级中文字幕一区二区| 任我爽在线视频精品一| 丰满人妻一区二区| 久久99精品国产麻豆婷婷| 97在线视频观看| xxxx日本少妇| 成人综合专区| 日韩精品免费在线视频观看| 国产成人强伦免费视频网站| 亚洲永久精品一区| 国产精品自拍第一页| 成久久久网站| 欧美精品一区二区三区高清aⅴ | av爱爱亚洲一区| 国产一区二区在线免费| 日本特级黄色片| 激情六月综合| 欧美大肥婆大肥bbbbb| 天堂在线中文视频| 午夜先锋成人动漫在线| 欧美成人一区二区三区片免费| 五月天婷婷激情视频| 九色porny自拍视频在线播放| 亚洲另类在线视频| 亚洲午夜激情| yjizz视频网站在线播放| 91小视频在线免费看| 成人在线视频网址| av中文字幕在线免费观看| 久久99精品视频| 国产精品欧美日韩一区二区| 蜜臀99久久精品久久久久小说| 激情综合自拍| 久久久久久国产精品| 欧美日韩国产精品一区二区三区| 欧美激情理论| 亚洲视频一区二区| 免费视频91蜜桃| 欧美男男gaytwinkfreevideos| 日韩精品中文字幕在线观看| 亚洲观看黄色网| 欧美精品国产白浆久久久久| 日韩高清免费观看| 在线 丝袜 欧美 日韩 制服| 综合干狼人综合首页| 日韩精品在线第一页| 国产精品无码永久免费不卡| 日韩欧美ww| 亚洲欧洲中文天堂| 亚洲av熟女国产一区二区性色| 欧美在线色图| 久久天天躁日日躁| 欧美日韩国产精品综合| av成人毛片| 欧洲成人免费aa| 伊人免费在线观看| 精品一二三四在线| 肥熟一91porny丨九色丨| 老熟妇高潮一区二区高清视频| av一区二区三区黑人| 精品国产乱码久久久久久丨区2区| | 国产精品综合在线视频| 波多野结衣久草一区| 天天操天天操天天干| 久久亚洲精精品中文字幕早川悠里| 日本午夜精品一区二区| 在线播放麻豆| 亚洲资源中文字幕| 无码精品a∨在线观看中文| 日韩毛片免费观看| 欧美一区二区三区视频免费| 亚洲色偷偷色噜噜狠狠99网| 色综合中文网| 久久天天躁夜夜躁狠狠躁2022| 日本三级网站在线观看| 日韩激情一区二区| 亚洲一区二区三区久久| 亚洲三级中文字幕| 亚洲视频免费在线| 欧美 丝袜 自拍 制服 另类| 99re久久| 亚洲精品99久久久久中文字幕| 国产精品成人无码免费| 国产精品九九| 国产精品久久91| 亚洲av无码乱码国产精品久久| 久久久久久久久蜜桃| 18视频在线观看娇喘| 小视频免费在线观看| 在线播放亚洲一区| 欧美 日本 国产| 亚洲精品一区二区妖精| 欧洲一区二区视频| 亚洲黄色一级大片| 国产精品久久久99| 成人毛片视频网站| 国产一区二区视频在线看| 亚洲欧洲第一视频| 国产精品第108页| 久久99久久精品| 日韩高清av| sm久久捆绑调教精品一区| 欧美疯狂性受xxxxx喷水图片| 制服丝袜第二页| 欧美日韩专区| 亚洲自拍偷拍色片视频| 国产区在线视频| 欧美日韩国产精品专区| 中国男女全黄大片| 一精品久久久| 国产女人18毛片水18精品| 日韩福利一区二区| 亚洲国产aⅴ成人精品无吗| 中文字幕线观看| 三上亚洲一区二区| 国产精品6699| 欧美理论在线观看| 午夜久久久久久| 少妇搡bbbb搡bbb搡打电话| 91影院成人| 国产免费一区视频观看免费| yourporn在线观看视频| 一本大道av伊人久久综合| 国产精品久久久久久久无码| 黄色av日韩| 国产精品日韩一区二区三区 | 国产探花在线精品| 91av视频导航| 无码国产伦一区二区三区视频| 亚洲一区在线观看视频| 久久久久亚洲av片无码v| 99热精品久久| 亚洲a级在线播放观看| 三区四区电影在线观看| 在线不卡的av| 久久久久久视频| 国产一区二区三区久久悠悠色av| 中文精品视频一区二区在线观看| 亚洲精品乱码日韩| 日韩亚洲精品电影| 日韩不卡高清视频| 中文字幕欧美日韩一区| 亚洲欧洲日本精品| 99久久.com| 91成人免费在线观看| 色噜噜狠狠狠综合欧洲色8| 精品国内二区三区| jizz国产免费| 久久奇米777| 91国产精品视频在线观看| 日韩88av| 不卡视频一区二区三区| 理论不卡电影大全神| 日韩av在线影院| 日韩黄色片网站| 中文字幕中文字幕中文字幕亚洲无线| 亚洲天堂av一区二区| 午夜激情一区| 久久www免费人成精品| 偷拍精品精品一区二区三区| 正在播放亚洲1区| 99久久精品国产一区二区成人| 亚洲一区二区视频| 波多野结衣 在线| 日本v片在线高清不卡在线观看| 在线视频一区观看| 1204国产成人精品视频| 91av中文字幕| 精品自拍一区| 日韩精品在线免费| 97超碰人人草| 婷婷久久综合九色综合绿巨人| 国产美女永久免费无遮挡| 国产在线精品一区二区三区不卡| 三上悠亚久久精品| 凹凸成人精品亚洲精品密奴| 懂色av一区二区三区在线播放| 亚洲人成午夜免电影费观看| www国产亚洲精品久久网站| 全部免费毛片在线播放一个| 欧美日韩亚洲综合| 欧美一二三区视频| 中文字幕亚洲精品在线观看 | 国产日本精品视频| 精品美女国产在线| 亚洲精品卡一卡二| 久久久久久久久久久电影| 欧美污在线观看| 日本系列欧美系列| www精品久久| 欧美韩日一区| 欧洲精品久久| 久久综合五月婷婷| 亚洲专区中文字幕| 成人一级视频| 日本久久久久久| 国产网红在线观看| 久久网福利资源网站| 美女欧美视频在线观看免费 | 欧美精品久久99| 亚洲黄色免费观看| 亚洲自拍偷拍网站| 国产精品国产三级国产传播| 欧美激情一区二区三区不卡| 亚洲男人在线天堂| 丁香六月综合激情| 992tv人人草| 麻豆91精品视频| 麻豆传传媒久久久爱| 亚洲另类黄色| 成人在线视频一区二区三区| 香蕉视频国产精品| 亚洲一区二区三区免费观看| 精品国产乱码久久久久久蜜坠欲下 | av在线一区二区三区| 日本女人黄色片| 久久成人麻豆午夜电影| 91av俱乐部| 免费视频久久| 成人免费在线小视频| 在线欧美不卡| 黄页网站在线观看视频| 国产精品第十页| 久久香蕉视频网站| 欧美日韩国产探花| 粉嫩av一区二区三区天美传媒| 91tv官网精品成人亚洲| 五月天色婷婷综合| 99久久综合| 亚洲小说欧美另类激情| 午夜久久免费观看| 中文字幕在线亚洲三区| 久久国产成人精品| 亚洲人成人77777线观看| 成人写真视频| 亚洲资源视频| 一区二区三区午夜视频| 可以免费看的黄色网址| 欧美久久九九| www.射射射| 免费在线日韩av| 久草综合在线观看| 久久国产精品72免费观看| 国产精品久久久久久久av福利| 精品中文字幕一区二区| 亚洲男人天堂2021| 国产毛片精品一区| 国产情侣久久久久aⅴ免费| 99久久综合狠狠综合久久| jizz欧美性20| 国产精品无遮挡| 欧美色图亚洲视频| 亚洲一区在线免费观看| 亚洲欧美精品一区二区三区| 欧洲一区二区三区免费视频| 在线亚洲欧美日韩| 日韩一级二级三级| 亚洲色图狠狠干| 最近中文字幕日韩精品| 羞羞视频在线观看不卡| 91精品国产高清久久久久久| 成人看片在线观看| 成人久久一区二区| 粉嫩的18在线观看极品精品| 久久青青草原| 欧美r级电影| 亚洲国产精品无码观看久久| 久久久久综合| 原创真实夫妻啪啪av| 99国产精品国产精品久久| 极品久久久久久久| 亚洲影视在线观看| www.欧美色| 日韩精品一区二区三区视频在线观看| 天堂在线中文| 久久伊人91精品综合网站| 成人在线黄色电影| 国产日韩在线看片| 女人抽搐喷水高潮国产精品| 一区二区不卡在线| 激情久久中文字幕| 高潮一区二区三区| 91亚洲精品久久久蜜桃| 亚洲二区在线播放| 91黄色免费网站| 人妻精品一区二区三区| 中文字幕日韩精品在线观看| av电影在线免费| 成人h视频在线| 狠狠操综合网| 男人添女人下部高潮视频在观看| 麻豆精品视频在线观看| 中文字幕 日本| 亚洲激情综合网| 中日韩在线观看视频| 亚洲精品成人久久电影| 麻豆影视国产在线观看| 日本午夜人人精品| 国产精品香蕉| 欧洲美女和动交zoz0z| 三级久久三级久久久| 在线黄色免费网站| 亚洲欧美另类图片小说| 最近中文字幕在线免费观看| 精品无人区太爽高潮在线播放| 青青在线视频| 成人乱人伦精品视频在线观看| 国产99精品| 无码人妻丰满熟妇区96| 国产99一区视频免费| 任我爽在线视频| 欧美三级日韩在线| 久草福利在线| 欧美有码在线视频| 精品资源在线| 国产美女主播在线播放| 国产精品影视天天线| 网爆门在线观看| 欧美日韩一本到| freemovies性欧美| 国产精品99导航| 精品国产乱码久久久| 欧美日韩在线成人| 久久综合色8888| 日本天堂网在线| 日韩精品福利网站| 绿色成人影院| 欧美日韩一区二区视频在线| 国产欧美91| 亚洲AV无码国产成人久久| 欧美午夜性色大片在线观看| 婷婷五月综合激情| 欧美性资源免费| 亚洲黄页在线观看| aaa毛片在线观看| 国产色一区二区| 在线观看黄色国产| 久久精品2019中文字幕| 精品一区二区三区中文字幕| 潘金莲一级淫片aaaaaa播放1| 国产成人午夜99999| 久久这里只有精品免费| 亚洲第一精品久久忘忧草社区| 久草在线中文最新视频| 日本亚洲导航| 精品中文字幕一区二区小辣椒| 极品颜值美女露脸啪啪| 欧美sm美女调教| 国产剧情av在线播放| 欧美一级二级三级| 日本欧美大码aⅴ在线播放| 香蕉成人在线视频| 91麻豆精品国产自产在线| 日韩av激情| 欧美成ee人免费视频| 日本午夜一区二区| 一区二区视频免费看| 精品av综合导航| 欧美一区 二区 三区| 特级西西444www大精品视频| 国产一区二区中文字幕| 不卡的免费av| 国产性色av一区二区| 爱情电影网av一区二区| 欧美亚洲黄色片| 久久久国产精品麻豆| 国产精品女同一区二区| 欧美激情在线一区| 亚洲黄页网站| 午夜诱惑痒痒网| 精品欧美国产一区二区三区| 五月天婷婷在线视频| 高清日韩一区| 日韩av中文字幕一区二区| 全网免费在线播放视频入口| 国产视频久久久久| 91成人短视频在线观看| 久草热视频在线观看| 国产精品久久久久久久久快鸭 | 噜噜噜久久亚洲精品国产品麻豆| 中文一区二区完整视频在线观看| 国产成人久久精品77777综合| 日韩免费视频在线观看| 欧美精品观看|