精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

狠狠色丁香久久婷婷综| 97超视频免费观看| av成人激情| 国产欧美日韩综合精品一区二区三区| 精品午夜一区二区三区| 亚洲欧洲制服丝袜| 天堂久久av| 欧美日韩成人免费观看| 91在线在线观看| 亚洲免费高清视频在线| 国产专区精品| 久久久久久天堂| 国产高清一区视频| 偷拍一区二区三区| 欧美一级色片| 国产成人无码专区| 一区二区在线观| 欧美一区二区三区的| 99精品视频免费观看| 手机在线精品视频| 嫩草av久久伊人妇女超级a| 一区二区三区天堂av| 激情综合色播激情啊| 色哟哟国产精品免费观看| 国产日韩中文在线中文字幕| 九九视频免费看| 国产原创精品| 欧美三级一区二区| 黑人一区二区| 成人午夜在线观看视频| 天天干天天色天天干| 91产国在线观看动作片喷水| 国产喂奶挤奶一区二区三区| 97色婷婷成人综合在线观看| 久久久久久久黄色片| 亚洲国产欧洲综合997久久| 日韩午夜激情免费电影| 久久亚洲电影| caoporn视频在线| 小向美奈子av| 少妇精品久久久久久久久久| 日韩h在线观看| 国产精品资源在线| 自拍偷拍亚洲图片| 久久午夜鲁丝片| 成人毛片视频网站| 国外视频精品毛片| 亚洲国产成人tv| 亚洲综合小说| 毛片在线视频| av片在线免费看| 日韩影视精品| 中文字幕亚洲图片| 中文字幕av免费专区久久| av资源久久| 黄网在线免费| 日韩一级av毛片| 欧美一区二区三区在线免费观看| 日韩成人免费视频| 久久香蕉国产线看观看99| 日韩精品免费一区二区三区竹菊| 欧美一区二区三区激情| 丰满少妇xbxb毛片日本| 黑人另类av| 亚洲理论在线a中文字幕| 91视频一区二区三区| 精品一区二区三区在线 | 亚洲成人中文字幕| 久久综合久久综合久久| 成人午夜av| 久草免费在线观看| 久久免费视频99| 日韩精品一区二区三区久久| 国产成人精品一区二区| 欧美疯狂做受xxxx富婆| 大白屁股一区二区视频| 国产综合久久久| 性xxxxfjsxxxxx欧美| 黑人一级大毛片| 日韩av卡一卡二| 精品一区久久久久久| 久久影院在线观看| 性久久久久久久久久久久| 美日韩一级片在线观看| 粉嫩久久久久久久极品| jizz在线免费观看| 欧美一区二区三区四| 一级黄色大片儿| 亚洲午夜激情| 国产精品成人一区二区| 亚洲国产欧美一区二区三区久久| 国产精品乱子久久久久| 亚洲一区国产一区| 亚洲精品国产九九九| 日本综合在线| 神马久久久久久久| 国产精品高清无码在线观看| 欧美成人精品免费| 超碰97在线资源| 欧美黑人性视频| 欧美一级欧美三级| 亚洲精品中文在线| 国产成人久久精品77777最新版本| 99精品在线免费在线观看| 成人黄色在线| 日韩免费啪啪| 99久久精品日本一区二区免费| 小泽玛利亚一区| 久久精品视频在线观看免费| 在线视频不卡一区二区三区| 国产精品丝袜一区二区三区| 精品久久久av| 精品久久国产97色综合| 欧美网站在线观看| 日本一区二区久久| 国产自产v一区二区三区c| 91精品综合久久久久久久久久久| 国产精品99久久免费| 第一av在线| yourporn在线观看视频| 国产麻豆免费视频| 国产乡下妇女做爰| 国产jizz18女人高潮| 亚洲日本久久久| www.精品在线| 国内少妇毛片视频| 日本在线播放一区| 国产欧美一区二区视频 | 亚洲人成网www| 福利一区在线| 密臀av在线播放| 精品美女在线观看视频在线观看| 国产香蕉在线观看| 91亚洲国产成人精品一区| 午夜偷拍福利视频| 久久一级免费视频| 白丝女仆被免费网站| 无码国产精品久久一区免费| 中文字幕国产传媒| 成人av一级片| 国产精品第157页| a级黄色片网站| 亚洲国产高清国产精品| 久久精品综合一区| 国产自产在线视频一区| 亚洲一区中文字幕在线观看| 国产精品成av人在线视午夜片| 午夜精品久久久久久久99热| 欧美激情亚洲精品| 久久久久久国产精品| 久久久av电影| 欧美激情2020午夜免费观看| www.精品av.com| 久久精品亚洲国产| 久久夜色撩人精品| 色综合久久久888| 欧美激情啊啊啊| 国内精品久久久久影院 日本资源| 欧美黄色片视频| 3344国产精品免费看| 日韩av成人在线| 国产精品免费在线免费| 91久久久精品| 国产精选一区二区| 日韩中文字幕av在线| 亚洲欧美日韩国产yyy| 国产福利片一区二区| av久久久久久| 激情六月丁香婷婷| 911福利视频| 深夜视频在线观看| 黄色av免费播放| 国产午夜精品一区二区理论影院 | 日韩精品视频免费专区在线播放 | 88av.com| 杨幂一区二区国产精品| 欧美成人三级伦在线观看| www色com| 亚欧洲精品在线视频| 亚洲综合五月天婷婷丁香| 亚洲第一成年人网站| 阿v免费在线观看| 福利影院在线看| 色狠狠一区二区三区| 丝袜美腿综合| 雨宫琴音一区二区在线| 精品一区二区三区免费观看| 26uuu精品一区二区在线观看| 亚洲女女做受ⅹxx高潮| 91九色02白丝porn| 日韩av中文字幕在线免费观看| 欧美成年人视频网站| 国产色视频一区| 欧美精品在线一区| 成年人看的毛片| 日韩电影免费观看在| 波多野结衣之无限发射| 日本黄色一级网站| 国产va在线播放| 97成人在线观看| 毛片av在线| 日本国产一区| 欧美激情一区| 国产91精品一区二区麻豆网站| 亚洲欧美一区二区久久| 欧美疯狂性受xxxxx喷水图片| 色综合伊人色综合网| 国产精品爽爽爽| 中文字幕一区二区三区在线乱码| 91高清国产视频| 91香蕉视频污在线观看| 国产美女www爽爽爽视频| 国产在线高清视频| 国产精品白浆| 日韩高清不卡一区| 亚洲欧美在线高清| 欧美videos中文字幕| 91国内产香蕉| 亚洲蜜桃av| 麻豆tv在线观看| 在线一区高清| 激情六月天婷婷| 蜜臀av一区二区三区有限公司| 超碰超碰超碰超碰| 操你啦视频在线| 精品国内亚洲2022精品成人| 日韩高清在线不卡| 一区二区在线观看不卡| 亚洲区免费影片| www.成人av.com| 日本人视频jizz页码69| 国产污片在线观看| 麻豆网站视频在线观看| 日韩一级电影| 国产激情一区二区三区桃花岛亚洲| 精品日韩中文字幕| 欧美另类老女人| 亚洲视频在线二区| 老司机福利av| 亚洲av成人无码久久精品老人 | 激情在线视频| 自拍自偷一区二区三区| 91欧美日韩| 国产日韩精品一区| 亚洲欧美日韩高清| 久久久久久九九| 一级国产黄色片| 欧美熟女一区二区| 给我免费播放日韩视频| 国产乱子轮精品视频| 3d成人动漫网站| 99www免费人成精品| 日韩欧美中文视频| av网站在线观看免费| 榴莲视频成人app| 国产一区三区三区| 日韩一级黄色大片| 国产乱码精品一区二区三区日韩精品| 日韩精品xxx| 日本黄色免费视频| 亚洲人成网77777色在线播放 | 国产一区二区自拍视频| 先锋影音一区二区| 国产不卡视频在线播放| 精品国产乱码久久久久久影片| 国产一区二区自拍| 日韩毛片无码永久免费看| 美女羞羞视频在线观看| 国内在线观看一区二区三区| 图片区小说区国产精品视频| 日韩av免费在线播放| 91高清国产视频| 色天堂在线视频| 久久在线视频免费观看| 亚洲成av人片在线观看无码| 国产69久久精品成人看| 不卡的在线视频| 欧美高清成人| 欧美精品播放| 在线观看视频欧美| 国产原创精品| 日本中文在线视频| 久久夜夜操妹子| 成人在线一区二区三区| 日韩少妇与小伙激情| 啊啊啊一区二区| 国产91绿帽单男绿奴| 成人一区不卡| 欧美日韩在线视频观看| 97影院在线午夜| 欧美a在线播放| 超碰aⅴ人人做人人爽欧美| 成人综合激情网| 欧美第一黄色网| 亚洲av无日韩毛片久久| 成人在线观看一区| 亚洲欧美日韩视频二区| 亚洲国产高清自拍| 国产肉体ⅹxxx137大胆| 国产极品999| 欧美日韩影院| 欧美tk—视频vk| a级黄色小视频| 四虎电影院在线观看| 国产精品一二| 亚洲欧美国产一区二区三区| 久久综合久久色| a中文在线播放| 韩国理伦片一区二区三区在线播放 | 亚洲高清在线播放| 91高潮大合集爽到抽搐| 91成人超碰| 亚洲激情在线视频| 无码人妻丰满熟妇区毛片| 玖玖综合伊人| 国内精品伊人久久久久av影院 | 国产午夜精品久久久 | 欧美成人三区| 国产成人三级在线观看| 91av福利视频| 女性裸体视频网站| 亚洲国产欧美在线观看| 欧美视频免费在线| 亚洲最新在线| 特黄视频在线观看| 久久一区欧美| 久久69精品久久久久久久电影好| 亚洲国产果冻传媒av在线观看| 亚洲精品一区三区三区在线观看| 亚洲黄色性网站| 神马一区二区影院| 天天插天天干天天操| 激情五月播播久久久精品| 91sao在线观看国产| 国产视频精品免费| 婷婷精品在线| 亚洲第一福利在线观看| www.com久久久| 国产一区二区精品调教| 伊人一区二区三区| 最新国产精品久久| 欧美孕妇孕交xxⅹ孕妇交| 国产成人在线视频网站| 成人黄色片在线| 中文字幕永久在线| 久久久久一区| 欧美与欧洲交xxxx免费观看| 不卡的免费av| 亚洲清纯自拍| 97免费在线视频| 日本三级片在线观看| 激情文学一区| 国语自产在线不卡| 日本中文字幕网| 亚洲一区二区网站| 国产精品高清网站| 亚洲综合免费视频| 国产精品一二三| 国产91精品一区二区绿帽| 噜噜噜久久,亚洲精品国产品| 国产黄色成人av| 国产亚洲欧美另类一区二区三区| 午夜精品久久久久久久99热黄桃| 久久超碰97中文字幕| 欧美日本亚洲视频| 无码 人妻 在线 视频| 女同一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 国产亚洲自拍av| 国产一区二区不卡| 一本色道久久综合亚洲精品婷婷| gogo高清在线播放免费| 91精品免费在线| 女人18毛片毛片毛片毛片区二| 日韩在线一区二区三区| 精品一区二区三区自拍图片区 | 1024国产在线| 亚洲国产sm捆绑调教视频 | 在线看三级电影| 色爱区综合激月婷婷| www.黄色网| 国产精品久久天天影视| 88国产精品欧美一区二区三区| 中文字幕 日韩有码| 99久久精品国产精品久久| 日本一区二区三区四区五区六区| 欧美一区久久久| 亚洲国产天堂久久国产91| 农村妇女精品一区二区| 久久精品国内一区二区三区| 欧美日韩精品免费观看视一区二区| 在线播放免费av| 欧美一二三区在线| 秋霞欧美一区二区三区视频免费 | 亚洲色图综合区| 久久99热国产| 最近中文字幕免费mv| 日韩午夜电影免费看| 色婷婷久久av| 国产伦子伦对白视频|