您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了如何實現Java并發編程線程間通訊,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
在Java中線程間通訊有多種方式,我這里列出一些常用方式,并用代碼的方式展示他們是如何實現的:
示例一:
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并發編程線程間通訊的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。