java多线程编程之Semaphore

java.util.concurrent.Semaphore这个类里面的主要方法为:

void acquire():Acquires a permit from this semaphore, blocking until one is available, or the thread isinterrupted.

boolean tryAcquire():Acquires a permit from this semaphore, only if one is available at the time of invocation.

void release(): Releases a permit, returning it to the semaphore.

//Test.java
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ExecutorService execSer = Executors.newCachedThreadPool();
		final Semaphore sem = new Semaphore(3);
		for (int i = 0; i < 12; i++) {
			final int NO = i;
			Runnable run = new Runnable(){
				public void run() {
					try {
						sem.acquire();
						Thread.sleep(1000);
						System.out.println("Runnable :"+NO);
						sem.release();
						System.out.println("---"+sem.availablePermits());
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			};
			execSer.execute(run);
		}
		execSer.shutdown();
	}

}

  

时间: 2024-10-13 18:13:34

java多线程编程之Semaphore的相关文章

java并发编程之Semaphore

信号量(Semaphore).有时被称为信号灯.是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们可以正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要.在许可可用前会堵塞每个 acquire(),然后再获取该许可.每个 release() 加入一个许可.从而可能释放一个正在堵塞的获取者. 可是.不使用实际的许可对象,Semaphore 仅仅对可用许可的号码进行计数,并採取对应的行动.拿到信号量的线程能够进入代码.否则就等待.通过acquir

java多线程编程之Future/FutureTask和Callable

有这样一种场景,用多线程发送数据到某个服务器,需要知道各个线程是否都发送成功,等所有线程都发送完成才能继续下一轮计算和发送.如果用传统的多线程方式,就需要启动多个线程,然后在每个线程中分别发送数据,外部通过某种方式等待各个线程全部都发送完成,再进行后面的计算等流程.这种实现方式的代码会比较臃肿,在java中提供了一种Callable+Future的方法,可以将异步的多线程调用变为同步方式. Callable 在java的多线程编程中,有Thread和Runnable两种方式来新建线程,其中Run

Java 多线程编程之:notify 和 wait 用法

wait 和 notify 简介 wait 和 notify 均为 Object 的方法: Object.wait() —— 暂停一个线程 Object.notify() —— 唤醒一个线程 从以上的定义中,我们可以了解到以下事实: 想要使用这两个方法,我们需要先有一个对象 Object. 在多个线程之间,我们可以通过调用同一个对象的wait()和notify()来实现不同的线程间的可见. 对象控制权(monitor) 在使用 wait 和 notify 之前,我们需要先了解对象的控制权(mon

java多线程编程之CountDownLatch

java.util.concurrent.CountDownLatch这个类里面的主要方法为: 1.countDown(),Decrements the count of the latch, releasing all waiting threads if the count reaches zero. 2.await(),Causes the current thread to wait until the latch has counted down to zero, unless the

Cocoa多线程编程之block与semaphore(信号量)

首先大家要了解 dispatch_queue 的运作机制及线程同步 我们可以将许多 blocks 用 dispatch_async 函数提交到 dispatch_queue ,如果类型是DISPATCH_QUEUE_SERIAL (串行),那么这些 block 是按照 FIFO (先入先出)的规则调度的,也就是说,先加入的先执行,后加入的一定后执行,但在如果类型是DISPATCH_QUEUE_CONCURRENT(并行),那么某一时刻就可能有多个 block 同时在执行. 这个时候,如果两个 b

iOS多线程编程之NSOperation和NSOperationQueue的使用(转自容芳志专栏)

转自由http://blog.csdn.net/totogo2010/ 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main.相当与ja

Java并发编程之volatile的理解

Java并发编程之volatile关键字的理解 Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝.线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的. volatile关键字是修饰字段的关键字,貌似是JDK1.5之后才有的,在多线程编程中,很大的几率会用到这个关键字,volatile修饰变量后该变量有这么一种效果:线程每一次读该变量都是直接从主

java并发编程之future模式

1.当你想并发去执行一段代码,但是还想获取这段代码的返回结果,那么future多线程模式就可以派上用场了,代码实现如下. public class Client { public Data request() { final FutureData futureData = new FutureData(); new Thread(new Runnable() { @Override public void run() { futureData.setRealData(new RealData()

iOS多线程编程之NSOperation和NSOperationQueue的使用

前一篇 <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展