java多執行緒協作Semaphore
阿新 • • 發佈:2018-12-12
Semaphore的意思是訊號量, 多執行緒中使用此類控制併發量, 常用的方法有acquire() 和 release()
Semaphore沒有空參構造, 建立物件時必須傳入一個permits 值, 代表最大併發數; 當permits = 1 時 ,代表單執行緒
下面看一個例子
package _Semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore = new Semaphore(1); for (int i = 0; i < 5; i++) { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); newCachedThreadPool.execute(new Runnable() { @Override public void run() { try { semaphore.acquire(); Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName()+" 執行"); semaphore.release(); } }); } } }
執行的結果是
pool-1-thread-1 執行
pool-3-thread-1 執行
pool-2-thread-1 執行
pool-4-thread-1 執行
pool-5-thread-1 執行
注意列印每一行都有一秒的間隔 ,
多執行緒應用中 , 只要增加permits 值即可;
需要注意的是acquire() 和 release() 方法中 都可以傳入 permits 值, 表示請求和釋放訊號量的值, 一般情況下, 請求和釋放的值是匹配的(相等)
下面例子中, semaphore 物件中 的permits 值是10 , 執行緒中每個請求都佔用4 個permits , 所以併發量是 10/4 = 2;
package _Semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore = new Semaphore(10); for (int i = 0; i < 5; i++) { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); newCachedThreadPool.execute(new Runnable() { @Override public void run() { try { semaphore.acquire(4); Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName()+" 執行"); semaphore.release(4); } }); } } }