最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程實現有序輸出ABC

 更新時間:2019年08月29日 15:41:41   作者:MeAndJack  
這篇文章主要為大家詳細介紹了java多線程實現有序輸出ABC,具有一定的參考價值,感興趣的小伙伴們可以參考一下

3個線程,線程1輸出A,線程2輸出B,線程3輸出C,讓這個3個線程循環(huán)有序地輸出ABCABC…

看到這個題目,感覺很有意思,問題的本質是在多線程執(zhí)行環(huán)境,控制線程的執(zhí)行順序,實現的方式有非常多種,本質上需要解決Java多線程環(huán)境下的線程執(zhí)行的同步和利用鎖機制來控制線程的執(zhí)行順序。

方式1:利用synchronized

這種方式也就是使用java內置的monitor機制,配合wait和notifyAll,代碼如下:

(1)利用volatile做線程間資源的同步訪問,同時作為線程調度的標志;
(2)利用notifyAll來喚醒其他等待當前的monitor資源的線程;

public class ThreadOrderWithSync {

  private volatile int flag = 'A';
  private final static Object LOCK = new Object();

  Runnable a = () -> {
    while (true) {
      synchronized (LOCK) {
        if (flag == 'A' ) {
          System.out.println("A");

          flag = 'B';
          // let other thread race to get the monitor
          LOCK.notifyAll();
        } else {
          try {
            LOCK.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  };

  Runnable b = () -> {
    while (true) {
      synchronized (LOCK) {
        if (flag == 'B' ) {
          System.out.println("B");

          flag = 'C';
          // let other thread race to get the monitor
          LOCK.notifyAll();
        } else {
          try {
            LOCK.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  };

  Runnable c = () -> {
    while (true) {
      synchronized (LOCK) {
        if (flag == 'C' ) {
          System.out.println("C");

          flag = 'A';
          // let other thread race to get the monitor
          LOCK.notifyAll();
        } else {
          try {
            LOCK.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  };

  public void runTest() {
    Thread ta = new Thread(a);
    Thread tb = new Thread(b);
    Thread tc = new Thread(c);

    ta.start();
    tb.start();
    tc.start();
  }

  public static void main(String[] args) {
    ThreadOrderWithSync sync = new ThreadOrderWithSync();
    sync.runTest();
  }
}

方式2:利用并發(fā)包ReentrantLock和Condition的鎖機制

上面方式1的synchronized機制,因為當前的所有線程都爭用同一個monitor資源,因此只能通過notifyAll來通知其他線程來加鎖,因此每次都會出現race condition,但是,通過ReentrantLock的Condition,我們可以精確控制,下一個該喚醒signal的線程是哪一個(因為我們知道執(zhí)行的順序是A->B->C的循環(huán)),相比synchronized的機制,Condition機制可以更精細化線程的調度設計,代碼示例如下:

/**
 * @author xijin.zeng created on 2018/8/31
 * Thrads runing order: A->B->C
 */
public class ThreadOrderWithCondition {

  private static final ReentrantLock LOCK = new ReentrantLock();
  private static final Condition C_A = LOCK.newCondition();
  private static final Condition C_B = LOCK.newCondition();
  private static final Condition C_C = LOCK.newCondition();

  /**
   * init for A to run first
   */
  private volatile int flag = 'A';

  Runnable a = () -> {
    while (true) {
      LOCK.lock();

      if (flag == 'A') {
        System.out.println("A");
        flag = 'B';
        // signal B to run
        C_B.signal();
      } else {
        try {
          // block and wait signal to invoke
          C_A.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }

      LOCK.unlock();
    }
  };

  Runnable b = () -> {
    while (true) {
      LOCK.lock();

      if (flag == 'B') {
        System.out.println("B");
        flag = 'C';
        // signal C to run
        C_C.signal();
      } else {
        try {
          // block and wait signal to invoke
          C_B.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }

      LOCK.unlock();
    }
  };

  Runnable c = () -> {
    while (true) {
      LOCK.lock();

      if (flag == 'C') {
        System.out.println("C");
        flag = 'A';
        // signal A to run
        C_A.signal();
      } else {
        try {
          // block and wait signal to invoke
          C_C.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }

      LOCK.unlock();
    }
  };

  public void runTest() {
    Thread threadA = new Thread(a);
    Thread threadB = new Thread(b);
    Thread threadC = new Thread(c);

    threadA.start();
    threadB.start();
    threadC.start();
  }

  public static void main(String[] args) {
    ThreadOrderWithCondition o = new ThreadOrderWithCondition();
    o.runTest();
  }
}

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

相關文章

  • 實例解析Java設計模式編程中的適配器模式使用

    實例解析Java設計模式編程中的適配器模式使用

    適配器模式的主要作用是在新接口和老接口之間進行適配,通過將一個類的接口轉換成客戶期望的另一個接口,讓原本不兼容的接口可以合作無間,本文以實例解析Java設計模式編程中的適配器模式使用,需要的朋友可以參考下
    2016-05-05
  • Java中JDBC連接數據庫詳解

    Java中JDBC連接數據庫詳解

    本文主要介紹了JDBC連接數據庫的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Java實現兩人五子棋游戲(六) 行棋方變換

    Java實現兩人五子棋游戲(六) 行棋方變換

    這篇文章主要為大家詳細介紹了Java實現一個簡單的兩人五子棋游戲,行棋方變換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 運行SpringBoot項目請求響應流程分析以及404和500報錯的解決辦法

    運行SpringBoot項目請求響應流程分析以及404和500報錯的解決辦法

    這篇文章主要介紹了運行Spring Boot項目請求響應流程分析以及404和500報錯的解決辦法,文中通過代碼示例和圖文講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • Java Arrays工具類用法詳解

    Java Arrays工具類用法詳解

    這篇文章主要介紹了Java Arrays工具類用法,結合實例形式分析了java Arrays工具類針對數組元素修改、復制、排序等操作使用技巧與相關注意事項,需要的朋友可以參考下
    2019-05-05
  • Spring的FactoryBean<Object>接口示例代碼

    Spring的FactoryBean<Object>接口示例代碼

    FactoryBean是Spring框架中的一個接口,用于創(chuàng)建和管理Bean對象,它的作用是將Bean的創(chuàng)建過程交給FactoryBean實現類來完成,而不是直接由Spring容器來創(chuàng)建,本文給大家介紹Spring的FactoryBean<Object>接口,感興趣的朋友一起看看吧
    2023-11-11
  • java11新特性之集合轉換為數組的方法

    java11新特性之集合轉換為數組的方法

    Java11引入了一種將帶有泛型的集合轉換為帶有泛型的數組的簡單方法,本文通過實例代碼介紹java11新特性之集合轉換為數組的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Java簡易計算器程序設計

    Java簡易計算器程序設計

    這篇文章主要為大家詳細介紹了Java簡易計算器程序設計的相關參考資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-10-10
  • Spring Boot jpa Service層代碼實例

    Spring Boot jpa Service層代碼實例

    這篇文章主要介紹了Spring Boot jpa Service層代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Spring框架花式創(chuàng)建Bean的n種方法(小結)

    Spring框架花式創(chuàng)建Bean的n種方法(小結)

    這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論

安陆市| 北流市| 娱乐| 凉山| 汽车| 文昌市| 嘉定区| 高陵县| 临夏县| 卫辉市| 徐水县| 云阳县| 和龙市| 宜良县| 泰来县| 东源县| 宾阳县| 司法| 若羌县| 四川省| 石棉县| 沙坪坝区| 肥乡县| 文昌市| 青川县| 邵阳县| 麦盖提县| 三都| 西安市| 喀什市| 长沙市| 信阳市| 咸宁市| 交口县| 泉州市| 四会市| 滨海县| 荥经县| 三江| 景宁| 清河县|