多线程编程入门(15):线程同步工具之Semaphore(信号量)

package cn.itcast.heima2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {
     public static void main(String[] args) {
	    ExecutorService service = Executors.newCachedThreadPool();
	    final Semaphore semaphore = new Semaphore(3);
	    for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {			
				@Override
				public void run() {
					try {
						semaphore.acquire();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + "进入,当前已有" + (3-semaphore.availablePermits())+"个并发");
					try {
						Thread.sleep((long)(Math.random()*10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程"+ Thread.currentThread().getName() + "即将离开");
					semaphore.release();
					//下面的代码有时候不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程"+ Thread.currentThread().getName() + "已离开,当前已有" + (3-semaphore.availablePermits())+"个并发");
				}
			};
			service.execute(runnable);
		}   	 
	 }
     
}

参考链接

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

你可能感兴趣的:(并发编程,多线程,同步)