`

jdk1.5的Semaphere同步工具

阅读更多
package cn.com.songjy.test.socket.thread;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:SemaphoreTest
 * 10个线程,每次只能并发运行3个线程
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-23 上午9:58:26
 */

public class SemaphoreTest {

	private static Log log = LogFactory.getLog(SemaphoreTest.class);

	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		//final Semaphore sp = new Semaphore(3, true);/*定义三个信号灯,先来先得(FIFO) ,每次只有三个线程获取信号灯*/
		final Semaphore sp = new Semaphore(3);/* 定义三个信号灯,随机获得 ,每次只有三个线程获取信号等*/
		for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						sp.acquire();//获取信号灯
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					log.info("线程" + Thread.currentThread().getName()
							+ "进入,当前已有" + (3 - sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					log.info("线程" + Thread.currentThread().getName() + "即将离开");
					sp.release();//运行完了,释放信号灯
					/*下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元*/
					log.info("线程" + Thread.currentThread().getName()
							+ "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发");
				}
			};
			service.execute(runnable);
		}
		service.shutdown();
	}

}
/*延伸:当只定义一个信号灯(new Semaphore(1))可实现互斥,相比synchronized,锁只能由线程自己释放,但使用Semaphore锁可以由其他线程释放*/


Semaphore的介绍和使用

CyclicBarrier介绍和使用
  • 大小: 182.1 KB
  • 大小: 212.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics