08 2014 档案

摘要:DelayQueue有序存储Delayed类型或者子类型的对象,没当从队列中取走元素时,需要等待延迟耗完才会返回该对象。所谓Delayed类型,因为需要比较,所以继承了Comparable接口:public interface Delayed extends Comparable { long... 阅读全文
posted @ 2014-08-29 14:36 梧留柒 阅读(1828) 评论(0) 推荐(1)
摘要:前面讲ScheduledThreadPoolExecutor曾经重点讲到了DelayedWorkQueue,这里说的PriorityBlockingQueue其实是DelayedWorkQueue的简化版本,实现了按序排列元素的功能。也就是说PriorityBlockingQueue是维护一个按序排... 阅读全文
posted @ 2014-08-28 10:06 梧留柒 阅读(1548) 评论(0) 推荐(1)
摘要:Exchanger可以看做双向数据传输的SynchronousQueue,即没有生产者和消费者之分,任意两个线程都可以交换数据。在JDK5中Exchanger被设计成一个容量为1的容器,存放一个等待线程,直到有另外线程到来就会发生数据交换,然后清空容器,等到下一个到来的线程。从JDK6开始,Exch... 阅读全文
posted @ 2014-08-27 22:23 梧留柒 阅读(1627) 评论(0) 推荐(0)
摘要:学过操作系统的朋友都知道信号量,在java.util.concurrent包中也有一个关于信号量的实现:Semaphore。从代码实现的角度来说,信号量与锁很类似,可以看成是一个有限的共享锁,即只能被有限数量的线程使用的共享锁。因为存在计数,因此Semaphore的构造函数有参数permits来设定... 阅读全文
posted @ 2014-08-26 16:07 梧留柒 阅读(1833) 评论(0) 推荐(0)
摘要:SynchronousQueue是一种很特别的BlockingQueue,任何一个添加元素的操作都必须等到另外一个线程拿走元素才会结束。也就是SynchronousQueue本身不会存储任何元素,相当于生产者和消费者手递手直接交易。SynchronousQueue有一个fair选项,如果fair为t... 阅读全文
posted @ 2014-08-25 15:21 梧留柒 阅读(2154) 评论(0) 推荐(1)
摘要:这篇文章主要说说DelayedWorkQueue。在ScheduledThreadPoolExecutor使用DelayedWorkQueue来存放要执行的任务,因为这些任务是带有延迟的,而每次执行都是取第一个任务执行,因此在DelayedWorkQueue中任务必然按照延迟时间从短到长来进行排序的... 阅读全文
posted @ 2014-08-22 16:44 梧留柒 阅读(2766) 评论(1) 推荐(2)
摘要:ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类,同时实现了ScheduledExecutorService接口。public class ScheduledThreadPoolExecutor extends ThreadPoolEx... 阅读全文
posted @ 2014-08-21 11:17 梧留柒 阅读(2989) 评论(0) 推荐(0)
摘要:这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭。先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int ... 阅读全文
posted @ 2014-08-20 21:25 梧留柒 阅读(1560) 评论(1) 推荐(1)
摘要:接着说worker线程是如何工作的。ThreadPoolExecutor有一个成员类叫Worker,所起到的作用就是线程池worker线程的作用。private final class Worker extends AbstractQueuedSynchronizer implements Runn... 阅读全文
posted @ 2014-08-15 10:04 梧留柒 阅读(1860) 评论(0) 推荐(0)
摘要:先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) { if (command == null) throw... 阅读全文
posted @ 2014-08-14 10:46 梧留柒 阅读(1934) 评论(0) 推荐(0)
摘要:AbstractExecutorService对ExecutorService的执行任务类型的方法提供了一个默认实现。这些方法包括submit,invokeAny和InvokeAll。注意的是来自Executor接口的execute方法是未被实现,execute方法是整个体系的核心,所有的任务都是在... 阅读全文
posted @ 2014-08-13 16:25 梧留柒 阅读(2532) 评论(0) 推荐(0)
摘要:concurrent包中Executor接口的主要类的关系图如下:Executor接口非常单一,就是执行一个Runnable的命令。public interface Executor { void execute(Runnable command);}ExecutorService接口扩展了E... 阅读全文
posted @ 2014-08-13 14:34 梧留柒 阅读(2029) 评论(0) 推荐(1)
摘要:CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别。因此这里就先讨论CopyOnWriteArrayList,然后再说CopyOnWriteArraySet。这里重... 阅读全文
posted @ 2014-08-12 14:36 梧留柒 阅读(1650) 评论(0) 推荐(0)
摘要:这篇文章来说说稍微复杂一些的LinkedBlockingQueue。LinkedBlockingQueue使用一个链表来实现,会有一个head和tail分别指向队列的开始和队列的结尾。因此LinkedBlockingQueue会有两把锁,分别控制这两个元素,这样在添加元素和拿走元素的时候就不会有锁的... 阅读全文
posted @ 2014-08-11 14:10 梧留柒 阅读(1905) 评论(0) 推荐(0)
摘要:对于BlockingQueue的具体实现,主要关注的有两点:线程安全的实现和阻塞操作的实现。所以分析ArrayBlockingQueue也是基于这两点。对于线程安全来说,所有的添加元素的方法和拿走元素的方法都会涉及到,我们通过分析offer方法和poll()方法就能看出线程安全是如何实现的。首先来看... 阅读全文
posted @ 2014-08-10 18:45 梧留柒 阅读(1455) 评论(0) 推荐(0)
摘要:想必大家都很熟悉生产者-消费者队列,生产者负责添加元素到队列,如果队列已满则会进入阻塞状态直到有消费者拿走元素。相反,消费者负责从队列中拿走元素,如果队列为空则会进入阻塞状态直到有生产者添加元素到队列。BlockingQueue就是这么一个生产者-消费者队列。BlockingQueue是Queue的... 阅读全文
posted @ 2014-08-09 15:49 梧留柒 阅读(1960) 评论(0) 推荐(0)
摘要:Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步。因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:ConcurrentMap。本篇文章主要关注ConcurrentMap接口以及它的Hash版本的实现Concu... 阅读全文
posted @ 2014-08-08 14:55 梧留柒 阅读(2980) 评论(2) 推荐(1)