java.util.concurrent
2015-07-06 17:34
337 查看
在java1.5发行版本中,java平台新增了java.util.concurrent。
包括了三部分:Executor Framework、并发集合(Concurrent Collection)、以及同步器(Synchronizer)
1 Executor Framework
Executor 接口
之前操作线程都通过,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方法的次数
示例程序:
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以外的,以后遇到再了解用法。
包括了三部分: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并发编程
- java并发包里的semaphore的用法
- java 并发包里Eexcutors创建线程池的几种方法
- CoreData 多线程下NSManagedObjectContext的使用
- 线程池ThreadPoolExecutor参数设置
- JAVA单例类的Double checked机制
- Spring2.5 定时器 错误 org.springframework.scheduling.quartz.SchedulerFactoryBean#0
- countdownlatch的用法
- ConcurrentHashMap原理分析
- JAVA中sleep()、wait()、yield()、join()方法浅析
- Java theory and practice: More flexible, scalable locking in JDK 5.0
- Java缓存使用ArrayList/HashMap的常见问题----ConcurrentModification
- Java BlockingQueue
- 几中垃圾收集器组合测试
- 自己写的基于链表的并发安全队列模板类concurrent_queue
- iOS多线程编程Part 3/3 - GCD
- CountDownLatch Test
- java线程池
- java.util.concurrent包下的Fork/Join框架