Java并发编程的艺术(十一)——倒计时器、同步屏障、信号量

栏目: Java · 发布时间: 7年前

内容简介:当多个线程需要执行时,若其中一个或多个线程需要等待其他线程完成某些操作后才能执行,则可用CountDownLatch实现功能。当多个线程到达屏障时将会被阻塞,只有这些线程的最后一个线程到达屏障后,屏障才会开门,所有被屏障拦截的线程才能继续执行,并且该屏障是可重复使用的。当有m个线程,n个资源(m > n且每个线程占用一个资源)时,Semaphore可用来控制同时访问资源的线程数量,以保证合理地使用资源。

当多个线程需要执行时,若其中一个或多个线程需要等待其他线程完成某些操作后才能执行,则可用CountDownLatch实现功能。

1.2 例程

public class CountDownLatchTest {

	static CountDownLatch c = new CountDownLatch(2);

	public static void main(String[] args) throws InterruptedException {
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(1);
				c.countDown();
				System.out.println(2);
				c.countDown();
			}
		}).start();

		c.await();
		System.out.println("3");
	}

}
复制代码

1.3 小结

  • ●CountDownLatch的计数器只能使用一次。
  • ●CountDownLatch的构造函数可设置一个int值作为计数器,每调用一个CountDownLatch的countDown()方法则该计算器减一,当计算器为0时可唤醒等待的线程。
  • ●计算器为0时,调用await()方法不会等待阻塞当前线程。

2. 同步屏障:CyclicBarrier

2.1 使用场景

当多个线程到达屏障时将会被阻塞,只有这些线程的最后一个线程到达屏障后,屏障才会开门,所有被屏障拦截的线程才能继续执行,并且该屏障是可重复使用的。

2.2 例程

public class CyclicBarrierTest {

	static CyclicBarrier c = new CyclicBarrier(2);

	public static void main(String[] args) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					c.await();
				} catch (Exception e) {

				}
				System.out.println(1);
			}
		}).start();

		try {
			c.await();
		} catch (Exception e) {

		}
		System.out.println(2);
	}
}
复制代码

2.3 小结

  • ●CyclicBarrier的构造函数可设置一个int值作为线程拦截数,每调用CyclicBarrier的await()方法则该int值将减一并阻塞当前线程,当该值为0时表示所有线程以到达屏障,此时需"放行"所有被拦截的线程。
  • ●CyclicBarrier有一个更加高级的构造函数CyclicBarrier(int parties,Runnable barrierAction),表示parties数量的线程在到达屏障时优先执行barrierAction线程。
  • ●CyclicBarrier的计数器可用reset()方法重置。

3. 信号量:Semaphore

3.1 使用场景

当有m个线程,n个资源(m > n且每个线程占用一个资源)时,Semaphore可用来控制同时访问资源的线程数量,以保证合理地使用资源。

3.2例程

public class SemaphoreTest {

    Semaphore semaphore = new Semaphore(3);
    
    public static void main(String[] args) {
        for ( int i=0; i<10; i++ ) {
            new Thread( new Runnbale(){
                public void run(){
                    semaphore.acquire();
                    
                   //这里执行任务代码
                   
                    semaphore.release();
                }
            } ).start();
        }
    }
}
复制代码

3.3 小结

  • ●Semaphore的构造函数接受一个int值作为许可证数目(即允许线程执行的数目)。
  • ●Semaphore的acquire()方法表示获得许可证,获取许可证失败的线程将无法执行。
  • ●Semaphore的release()方法表示释放许可证。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据挖掘技术

数据挖掘技术

[美]MichaelJ.A.B / 别荣芳、尹静、邓六爱 / 机械工业 / 2006-7 / 49.00元

本书是数据挖掘领域的经典著作,数年来畅销不衰。全书从技术和应用两个方面,全面、系统地介绍了数据挖掘的商业环境、数据挖掘技术及其在商业环境中的应用。自从1997年本书第1版出版以来,数据挖掘界发生了巨大的变化,其中的大部分核心算法仍然保持不变,但是算法嵌入的软件、应用算法的数据库以及用于解决的商业问题都有所演进。第2版展示如何利用基本的数据挖掘方法和技术,解决常见的商业问题。 本书涵盖核心的数......一起来看看 《数据挖掘技术》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具