国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

Java并發編程線程間通訊實現過程詳解

瀏覽:6日期:2022-09-01 17:18:04

在Java中線程間通訊有多種方式,我這里列出一些常用方式,并用代碼的方式展示他們是如何實現的:

共享變量 wait, notify,notifyAll(這3個方法是Object對象中的方法,且必須與synchronized關鍵字結合使用) CyclicBarrier、CountDownLatch 利用LockSupport Lock/Condition機制 管道,創建管道輸出流PipedOutputStream和管道輸入流PipedInputStream

示例一:

package com.zhi.test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.atomic.AtomicInteger;import org.junit.Test;/** * Java多線程-線程通訊示例<br> * flag作為共享變量JobB執行,notify通知Job執行,CountDownLatch通知主線程執行 * * @author 張遠志 * @since 2020年5月4日21:51:24 * */public class ThreadTest2 { private CountDownLatch latch; private volatile boolean flag = true; private Object lock = new Object(); private AtomicInteger num = new AtomicInteger(0); class JobA implements Runnable { @Override public void run() { synchronized (lock) {flag = false;if (num.get() != 3) { try { lock.wait(); // wait方法會釋放鎖 } catch (InterruptedException e) { }}System.out.println('任務A收到通知,繼續執行作業'); } latch.countDown(); } } class JobB implements Runnable { @Override public void run() { while (flag) { // 保證JobA先申請到鎖 } synchronized (lock) {for (int i = 1; i <= 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { } int a = num.incrementAndGet(); System.out.println('任務B第' + i + '次執行,num值為:' + a); if (a == 3) { lock.notify(); // 喚醒JobB線程,notify方法不會釋放鎖 }} } latch.countDown(); } } @Test public void test() { latch = new CountDownLatch(2); new Thread(new JobA()).start(); new Thread(new JobB()).start(); try { latch.await(); // 保證2個線程都執行完畢 } catch (InterruptedException e) { } }}

結果輸出:

任務B第1次執行,num值為:1任務B第2次執行,num值為:2任務B第3次執行,num值為:3任務B第4次執行,num值為:4任務B第5次執行,num值為:5任務A收到通知,繼續執行作業

示例二:

package com.zhi.test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.locks.LockSupport;import org.junit.Test;/** * Java多線程-線程通訊示例,利用LockSupport * * @author 張遠志 * @since 2020年5月4日21:51:24 * */public class ThreadTest3 { private CountDownLatch latch; private volatile int num = 0; private Thread ta; private Thread tb; class JobA implements Runnable { @Override public void run() { if (num != 3) {LockSupport.park(); } System.out.println('任務A收到通知,繼續執行作業'); latch.countDown(); } } class JobB implements Runnable { @Override public void run() { for (int i = 1; i <= 5; i++) {try { Thread.sleep(1000);} catch (InterruptedException e) {}num++;System.out.println('任務B第' + i + '次執行,num值為:' + num);if (num == 3) { LockSupport.unpark(ta); // unpark會立即激活傳入線程} } latch.countDown(); } } @Test public void test() { latch = new CountDownLatch(2); ta = new Thread(new JobA()); tb = new Thread(new JobB()); ta.start(); tb.start(); try { latch.await(); // 保證2個線程都執行完畢 } catch (InterruptedException e) { } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 日韩精品亚洲专区在线观看 | 久久国产一区二区三区 | 一级女性全黄生活片免费 | 亚洲图片视频在线 | 久久久精品久久视频只有精品 | aaa一级毛片 | 日本免费一区二区三区三州 | 日韩中文字幕视频在线 | 国产精品久草 | 久久视频这里只有精品 | 国产全部理论片线观看 | 国产精品一级 | 亚洲第五色综合网啪啪 | 毛片网站在线播放 | 欧美高清另类自拍视频在线看 | 在线视频观看免费视频18 | 国产在线手机视频 | 国产盗摄精品一区二区三区 | 欧美在线一区二区三区欧美 | 欧美日韩成人在线视频 | 91高清国产经典在线观看 | 欧美日韩一区二区在线观看 | 免费国产成人高清在线观看不卡 | 国产成人精品综合网站 | 国产高中生粉嫩无套第一次 | 久久伊人操 | 韩国精品一区二区三区在线观看 | 亚洲人成一区二区三区 | 综合欧美一区二区三区 | 亚洲jjzzjjzz在线播放 | 亚洲精品一区二区在线播放 | 亚洲欧美日韩国产综合 | 高跟丝袜美女一级毛片 | 成人深夜福利在线播放不卡 | 国产成人精品日本亚洲专区6 | 国产成人亚洲综合 | 日本一级特黄特色大片免费视频 | 香蕉香蕉国产片一级一级毛片 | 高清一区二区 | 成人午夜精品久久不卡 | 午夜三级a三级三点在线观看 |