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

Java 信號量Semaphore的實現(xiàn)

 更新時間:2019年09月12日 09:32:15   作者:全王工二一  
這篇文章主要介紹了Java 信號量Semaphore的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

近日于LeetCode看題遇1114 按序打印,獲悉一解法使用了Semaphore,順勢研究,記心得于此。

此解視Semaphore為鎖,以保證同一時刻單線程的順序執(zhí)行。在此原題上,我作出如下更改。

package test;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
 
public class SemaphoreDemo {
 static Semaphore A;
 static Semaphore B;
 static Semaphore C;
 
 public static void main(String[] args) throws InterruptedException { 
    A = new Semaphore(1);
    B = new Semaphore(0);
    C = new Semaphore(0);
    
    ExecutorService ex=Executors.newFixedThreadPool(10);
    
 for (int i = 0; i <7; i++) {
  ex.execute(new R1());
  ex.execute(new R2());
  ex.execute(new R3());
 }
    ex.shutdown();
  }   
 
 public static class R1 implements Runnable{
 @Override
 public void run() {
  try {
//  A.acquire();
  System.out.println("1"+Thread.currentThread().getName());
//  B.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
 public static class R2 implements Runnable{
 @Override
 public void run() {
  try {
//  B.acquire();
  System.out.println("2"+Thread.currentThread().getName());
//  C.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
 public static class R3 implements Runnable{
 @Override
 public void run() {
  try {
//  C.acquire();
  System.out.println("3"+Thread.currentThread().getName());
//  A.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
}

10個線程的常量池中,分別調用R1,R2,R3的方法多次,控制臺輸出對應各方法名拼接執(zhí)行該方法的線程名。多次執(zhí)行結果各不相同:

1pool-1-thread-1
2pool-1-thread-2
1pool-1-thread-4
3pool-1-thread-6
2pool-1-thread-5
3pool-1-thread-3
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
3pool-1-thread-1
2pool-1-thread-8
1pool-1-thread-4
3pool-1-thread-1
1pool-1-thread-2
2pool-1-thread-9
1pool-1-thread-10
3pool-1-thread-1
2pool-1-thread-5
1pool-1-thread-6
3pool-1-thread-4
2pool-1-thread-8
1pool-1-thread-1
2pool-1-thread-2
3pool-1-thread-3
1pool-1-thread-4
2pool-1-thread-5
3pool-1-thread-6
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
1pool-1-thread-10
3pool-1-thread-1
1pool-1-thread-4
2pool-1-thread-8
3pool-1-thread-3
2pool-1-thread-10
1pool-1-thread-2
2pool-1-thread-9
3pool-1-thread-4
1pool-1-thread-7
3pool-1-thread-6
2pool-1-thread-5

方法能調用,多線程下卻無法保證方法的順序執(zhí)行。使用Semaphore后,代碼為:

package test;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
 
public class SemaphoreDemo {
 static Semaphore A;
 static Semaphore B;
 static Semaphore C;
 
 public static void main(String[] args) throws InterruptedException { 
    A = new Semaphore(1);
    B = new Semaphore(0);
    C = new Semaphore(0);
    
    ExecutorService ex=Executors.newFixedThreadPool(10);
    
 for (int i = 0; i <7; i++) {
  ex.execute(new R1());
  ex.execute(new R2());
  ex.execute(new R3());
 }
    ex.shutdown();
  }   
 
 public static class R1 implements Runnable{
 @Override
 public void run() {
  try {
  A.acquire();
  System.out.println("1"+Thread.currentThread().getName());
  B.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
 public static class R2 implements Runnable{
 @Override
 public void run() {
  try {
  B.acquire();
  System.out.println("2"+Thread.currentThread().getName());
  C.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
 public static class R3 implements Runnable{
 @Override
 public void run() {
  try {
  C.acquire();
  System.out.println("3"+Thread.currentThread().getName());
  A.release();
  } catch (Exception e) {
  e.printStackTrace();
  }
 } 
  }
 
}

多次運行結果皆能保證1、2、3的順序:

1pool-1-thread-1
2pool-1-thread-2
3pool-1-thread-3
1pool-1-thread-4
2pool-1-thread-5
3pool-1-thread-6
1pool-1-thread-7
2pool-1-thread-8
3pool-1-thread-9
1pool-1-thread-10
2pool-1-thread-1
3pool-1-thread-2
1pool-1-thread-3
2pool-1-thread-4
3pool-1-thread-5
1pool-1-thread-6
2pool-1-thread-9
3pool-1-thread-7
1pool-1-thread-10
2pool-1-thread-8
3pool-1-thread-1

附上api文檔鏈接 Semaphore

 A = new Semaphore(1);
 B = new Semaphore(0);
 C = new Semaphore(0);

進入R2、R3方法的線程會執(zhí)行acquire()方法,而B、C中的計數(shù)器為0獲取不到許可,阻塞直到一個可用,或者線程被中斷,不能繼續(xù)執(zhí)行。R1方法中A尚有1個許可可拿到,方法執(zhí)行,并給B發(fā)布一個許可,若B先于A執(zhí)行acquire(),此時B為阻塞狀態(tài),則獲取到剛剛發(fā)布的許可,該線程被重新啟用。

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

相關文章

  • 詳解如何在Java中實現(xiàn)屏幕共享

    詳解如何在Java中實現(xiàn)屏幕共享

    在本文中,將為大家展示如何利用 JxBrowser 的功能,實現(xiàn)運行在不同電腦上的兩個 Java 應用程序之間的屏幕共享,感興趣的小伙伴可以參考一下
    2024-10-10
  • 一文帶你搞懂Java中線程的創(chuàng)建方式

    一文帶你搞懂Java中線程的創(chuàng)建方式

    這篇文章主要為大家詳細介紹了Java中線程的創(chuàng)建方式的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Java中的Map允許有重復元素嗎?

    Java中的Map允許有重復元素嗎?

    今天小編就為大家分享一篇關于Java中的Map允許有重復元素嗎?,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Springboot RocketMq實現(xiàn)過程詳解

    Springboot RocketMq實現(xiàn)過程詳解

    這篇文章主要介紹了Springboot RocketMq實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • java Split 實現(xiàn)去除一個空格和多個空格

    java Split 實現(xiàn)去除一個空格和多個空格

    這篇文章主要介紹了java Split 實現(xiàn)去除一個空格和多個空格,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java獲取線程ID的實例

    Java獲取線程ID的實例

    以下實例演示了如何使用 getThreadId() 方法獲取線程id,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • 深入了解Maven Settings.xml文件的結構和功能

    深入了解Maven Settings.xml文件的結構和功能

    這篇文章主要為大家介紹了Maven Settings.xml文件基本結構和功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java繼承超詳細教程

    Java繼承超詳細教程

    繼承是面向對象語法的三大特征之一,繼承可以降低代碼編寫的冗余度,提高編程的效率,通過繼承,子類獲得了父類的成員變量和方法,一個子類如何繼承父類的字段和方法,如何修改從父類繼承過來的子類的方法呢,今天我們開始學習有關Java繼承的知識,感興趣的朋友一起看看吧
    2023-11-11
  • SSH框架網上商城項目第11戰(zhàn)之查詢和刪除商品功能實現(xiàn)

    SSH框架網上商城項目第11戰(zhàn)之查詢和刪除商品功能實現(xiàn)

    這篇文章主要為大家詳細介紹了SSH框架網上商城項目第11戰(zhàn)之查詢和刪除商品功能實現(xiàn)的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java設計模式之策略模式詳解

    Java設計模式之策略模式詳解

    這篇文章主要為大家詳細介紹了Java設計模式之策略模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

神农架林区| 栾川县| 襄垣县| 天等县| 浪卡子县| 北碚区| 马山县| 海原县| 新竹市| 绵竹市| 芦溪县| 和田市| 瑞丽市| 汕头市| 龙江县| 海晏县| 兖州市| 徐州市| 洛隆县| 醴陵市| 黔南| 休宁县| 安塞县| 邯郸市| 连云港市| 武功县| 曲周县| 大名县| 镶黄旗| 乾安县| 邵武市| 平度市| 灵山县| 云安县| 谢通门县| 新和县| 图木舒克市| 汾阳市| 任丘市| 中西区| 清远市|