java.util.concurrent

原创 2015年07月06日 17:34:50

在java1.5发行版本中,java平台新增了java.util.concurrent。

包括了三部分:Executor Framework、并发集合(Concurrent Collection)、以及同步器(Synchronizer)

1 Executor Framework

Executor 接口

public interface Executor {
    void execute(Runnable command);
}

之前操作线程都通过,Thread现在可以通过Executor 对象,此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
并且同时java.util.concurrent.Executors中提供了一系列创建具有各种功能的Executor的工厂方法(不仅仅这些),也就是说大部分情况下我们可以不用自己实现,使用现成的Executor对象。

简单介绍两个java.util.concurrent.Executors中的工厂方法,
static ExecutorService newCachedThreadPool():创建缓存的线程池,如果当前没有线程可用,就创建一个新的线程
static ExecutorService newFixedThreadPool(int nThreads) :创建固定数目的线程池。

2 并发集合

内部同步的集合对象,与通常的集合对象功能相同,但是并发集合是同步的,在需要线程安全的条件下,优先使用并发集合。例如:ConcurrentMap的实现类ConcurrentHashMap

3 同步器
同步器是一些事线程能够等待另一个线程的对象,允许他们协调动作,
书上的例子使用的是CountDownLatch,简单介绍一下CountDownLatch(倒计数锁存器)是一次性的障碍,允许一个或者多个线程等待一个或者多个线程来做某些事情,CountDownLatch的唯一构造器上带有一个int类型的参数,这个int参数时指允许所有在等待的线程被处理之前,必须在锁存器上调用countDown方法的次数
示例程序:

public class CountDownLatchTest 
{   
    private static int concurrency = 10;

    private static int x = 0;

    private static synchronized int addX()
    {
        return x++;
    }

    public static void main(String[]args)  throws Exception
    {
        final CountDownLatch ready = new CountDownLatch(concurrency);
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch done = new CountDownLatch(concurrency);

        Executor executor = Executors.newFixedThreadPool(20);

        for(int i=0;i<concurrency;i++)
        {
            executor.execute(new Runnable(){
                private int order = 0;
                public void run(){
                    System.out.println((order=addX())+"号准备完毕");
                    ready.countDown();

                    try
                    {
                        start.await();
                        System.out.println(order+"号执行ing...完毕");
                    }
                    catch(InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                    }
                    finally
                    {
                        done.countDown();
                    }
                }
            });
        }

        ready.await();
        long startNaos = System.nanoTime();
        start.countDown();
        done.await();
        System.out.println("所有线程执行完毕");
        System.out.println(System.nanoTime() - startNaos);
    }
}

await()方法具有阻塞作用,countDown()方法没有阻塞作用。
执行过程:
子线程启动后,执行到start.await();会被阻塞,
主线程直接会被ready.await();阻塞,
当所有的子线程都执行过ready.countDown();以后,ready.countDown();执行次数已够,主线程的ready.await();阻塞打开。
主线程继续执行start.countDown();,start.await();阻塞被打开,所有子线程开始执行
主线程被done.await();阻塞,
当所有子线程执行完毕后,done.countDown();次数执行次数已够,主线程继续执行

达到效果就是:
当所有子线程都被阻塞在start.await();后
解除主线程的ready.await();阻塞
主线程执行start.countDown();,所有子线程同时执行,
在最后一个子线程执行done.countDown();后
解除主线程的done.await();阻塞

常用的同步器有CountDownLatch和Semaphore,较不常用的是CyclicBarrier和Exchanger。
CountDownLatch以外的,以后遇到再了解用法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java_util_concurrent中文指南

  • 2017-09-06 15:39
  • 617KB
  • 下载

java.util.concurrent中Phaser的分析

适用场景: CountDownLatch和CyclicBarrier都是JDK 1.5引入的,而Phaser是JDK 1.7引入的。Phaser的功能与CountDownLatch和CyclicBar...

java.util.concurrent 学习ppt

  • 2008-09-20 20:35
  • 612KB
  • 下载

JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介

在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。 一、简介 线程池类为 java.util.concurrent.ThreadPoolExe...

java.util.concurrent 用法实例详解

编写多线程的程序一直都是一件比较麻烦的事情,要考虑很多事情,处理不好还会出很多意想不到的麻烦。加上现在很多开发者接触到的项目都是打着企业级旗号的B/S项目,大多数人都很少涉及多线程,这又为本文的主角增...

java.util.concurrent 详解

  • 2014-03-09 16:46
  • 174KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)