public class ThreadCommunication { /** * 三個線程a、b、c並發運行,b,c需要a線程的數據怎么實現 * * 根據問題的描述,通過三個線程,ThreadA ThreadB ThreadC * ThreadA用於初始化數據num,只有num初始化完成之后再讓ThreadB和ThreadC獲取到初始化的變量num。 * * * 分析過程如下: * 考慮到線程的不確定性,因此我們不能確保ThreadA就一定先於ThreadB和ThreadC前執行,就算 * ThreadA先執行了,我們也無法保證ThreadA什么時候才能將變量num初始化完成。因此我們必須讓 * ThreadB和ThreadC去等待ThreadA完成任務后發出的消息 * * 解決兩個問題: * 1:讓ThreadB和ThreadC先執行完 * 2:ThreadA執行完之后給ThreadB和ThreadC發送消息 */ /** * 兩種解決方案 * 1、使用純Java API的Semaphore類來控制線程的等待和釋放 * 2、使用Android提供的消息機制 */ //定義一個變量作為數據 private static int num; public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { @Override public void run() { try { //模擬耗時操作之后初始化變量num Thread.sleep(1000); num=1; } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"獲取到num的值為:"+num); } }); Thread threadC = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"獲取到num的值為:"+num); } }); //同時開啟三個線程 threadA.start(); threadB.start(); threadC.start(); } }
運行結果:
Thread-2獲取到num的值為:0
Thread-1獲取到num的值為:0
解決方案1:
public class ThreadCommunication { /** * 三個線程a、b、c並發運行,b,c需要a線程的數據怎么實現 public class ThreadCommunication { //定義一個變量作為數據 private static int num; /** * 定義一個信號量,該類內部維持了多個線程鎖,可以阻塞多個線程,釋放多個線程 * 線程的阻塞是和釋放是通過permit概念來實現的 * 線程通過semaphore.acquire()方法獲取permit,如果當前線程有permit則分配給該線程 * 如果沒有則阻塞該線程直到semaphore * 調用release()方法釋放permit * 構造函數中參數:permit(允許)個數; */ private static Semaphore semaphore = new Semaphore(0); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { @Override public void run() { try { //模擬耗時操作之后初始化變量num Thread.sleep(1000); num = 1; //初始化參數后釋放兩個permit semaphore.release(2); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { try { //獲取permit,如果semaphore沒有可用的permit則等待,如果有則消耗一個 semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"獲取到的num的值為:"+num); } }); Thread threadC = new Thread(new Runnable() { @Override public void run() { try { //獲取permit,如果semaphore沒有可用的permit則等待,如果有則消耗一個 semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"獲取到的num的值為:"+num); } }); //同時開啟三個線程 threadA.start(); threadB.start(); threadC.start(); } }
運行結果:
Thread-1獲取到的num的值為:1
Thread-2獲取到的num的值為:1