1. 程式人生 > >java多執行緒協作Semaphore

java多執行緒協作Semaphore

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);
				}
			});
			
		}
		
	}
}