<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java 信號量示例 > 原文: [https://javatutorial.net/java-semaphore-example](https://javatutorial.net/java-semaphore-example) 信號量可用于限制并發線程的數量,并且實質上,此類維護一組許可。 `acquire()`從信號量獲取許可,然后`release()`將許可返回信號量。 如果沒有許可證,則`acuire()`將阻塞直到可用 信號量用于控制對特定資源的訪問。 ![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg) **工作流程** 信號量設置為一個計數值。 然后線程嘗試獲取許可,如果計數為 0 或小于 0,則線程將被阻塞,并且它將等待下一個許可(如果有)。 這將一直保持下去,直到數量大于 0。如果是,則信號量將提供對線程資源的訪問。 然后線程將釋放許可,計數將增加 1。 ## 構造器 1. `Semaphore(int permits)`:使用給定數量的許可和不公平的公平設置創建一個信號量 2. `Semaphore(int permits, boolean fair)`:創建具有給定許可數量和給定公平性設置的信號量 ## 主要方法 1. `void acquire()`:從當前信號量獲取許可,阻塞直到可用,否則線程被中斷。 2. `void acquire(int permits)`:從當前信號量獲取指定的許可數量,直到所有可用或線程中斷為止一直阻塞。 3. `int availablePermites()`:返回當前信號量中可用的當前許可數量 要查看所有方法,[請單擊此處,您將被重定向到 Oracle 官方文檔](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html)。 信號量可用于鎖定對特定資源的訪問。 每個線程都必須請求“權限”,因此需要在訪問資源之前調用方法`acquire()`。 當線程不再需要資源時,它必須調用`release()`來釋放鎖。 ```java import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) throws Exception { Semaphore semExample = new Semaphore(1); System.out.println("Available permits: " + semExample.availablePermits()); semExample.release(); System.out.println("Available permits: " + semExample.availablePermits()); semExample.acquire(); System.out.println("Available permits: " + semExample.availablePermits()); semExample.acquire(); System.out.println("Available permits: " + semExample.availablePermits()); semExample.acquire(); System.out.println("Available permits: " + semExample.availablePermits()); } } ``` **輸出** ```java Available permits: 1 Available permits: 2 Available permits: 1 Available permits: 0 ``` 從上面的示例中可以看到,當您調用`release()`時,您正在向`Semaphore`實例添加許可。 當您調用`acquire()`時,您正在刪除`permit()`。 如果沒有許可證,而您打電話給獲取,它將等待直到許可證被釋放,因此在上例中將永遠不會執行最后一個打印語句。 如果您有 1 個許可,然后又有一個`acquire()`調用,緊接著是一個`release()`調用,則稱為鎖。 ```java import java.util.concurrent.Semaphore; public class SemaphoreDemo { Semaphore thread = new Semaphore(1); public static void main(String args[]) { final SemaphoreDemo test = new SemaphoreDemo(); new Thread(){ @Override public void run(){ test.mutualExclusion(); } }.start(); new Thread(){ @Override public void run(){ test.mutualExclusion(); } }.start(); } private void mutualExclusion() { try { System.out.println(Thread.currentThread().getName() + " is waiting to acquire a permit."); thread.acquire(); System.out.println("Permit has been acquired to " + Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println(Thread.currentThread().getName() + " is releasing the permit..."); thread.release(); System.out.println("Released."); } } } ``` **輸出** ```java Thread-0 is waiting to acquire a permit. Permit has been acquired to Thread-0 Thread-1 is waiting to acquire a permit. Thread-0 is releasing the permit... Released. Permit has been acquired to Thread-1 Thread-1 is releasing the permit... Released. ``` 從輸出中可以看到,線程 0 允許了一個獲取,線程 1 開始等待為其本身獲取一個許可,但是它(線程 1)僅在線程 0 釋放其許可時才獲得它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看