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

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

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

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

此解視Semaphore為鎖,以保證同一時(shí)刻單線程的順序執(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個(gè)線程的常量池中,分別調(diào)用R1,R2,R3的方法多次,控制臺輸出對應(yīng)各方法名拼接執(zhí)行該方法的線程名。多次執(zhí)行結(jié)果各不相同:

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

方法能調(diào)用,多線程下卻無法保證方法的順序執(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();
  }
 } 
  }
 
}

多次運(yùn)行結(jié)果皆能保證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);

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    Java中的Map允許有重復(fù)元素嗎?

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

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

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

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

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

    Java獲取線程ID的實(shí)例

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

    深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

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

    Java繼承超詳細(xì)教程

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

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

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

    Java設(shè)計(jì)模式之策略模式詳解

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

最新評論

县级市| 缙云县| 巢湖市| 龙海市| 三台县| 揭阳市| 肥西县| 任丘市| 开封市| 镇坪县| 襄樊市| 肃南| 巴南区| 朝阳市| 高雄县| 遂平县| 甘德县| 阳原县| 徐闻县| 新田县| 平阴县| 许昌市| 建水县| 凯里市| 亚东县| 金川县| 南充市| 兴宁市| 河曲县| 精河县| 凤山县| 呼玛县| 乳源| 甘孜县| 穆棱市| 旺苍县| 安阳县| 准格尔旗| 青田县| 康乐县| 德化县|