java多线程编程需要知道的几个类

CountDownLatch类
CountDownLatch 是个计数器,它有一个初始数,等待这个计数器的线程必须等到计数器倒数到零时才可继续。
比如说一个 Server 启动时需要初始化 4个部件,Server 可以同时启动 4个线程去初始化这 4个部件,然后调用CountDownLatch(4).await()阻断进入等待,每个线程完成任务后会调用一次CountDownLatch.countDown()来倒计数, 当 4个线程都结束时CountDownLatch 的计数就会降低为0,此时 Server 就会被唤醒继续下一步操作。
CountDownLatch的方法主要有:
await()
使调用此方法的线程阻断进入等待
countDown()
倒计数,将计数值减1
getCount()
得到当前的计数值
CyclicBarrier类
CyclicBarrier 初始时设定一个线程数和操作,当barrier等待线程进入初始设定的线程数量的时候,释放所有线程,执行初始时设定的操作。
CyclicBarrier 类似于 CountDownLatch 也是个计数器,不同的是 CyclicBarrier 数的是调用了 CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier 初始时规定的数目时,所有进入等待状态的线程被唤醒并继续执行。
CyclicBarrier 就象它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier 初始时还可带一个Runnable的参数,此Runnable 任务在 CyclicBarrier 的数目达到后,所有其它线程被唤醒前被执行。
CyclicBarrier 提供以下几个方法:
await():进入等待
getParties():返回此 barrier 需要的线程数
reset():将此barrier 重置
BlockingQueue类
BlockingQueue 是一种特殊的 Queue,若 BlockingQueue 是空的,从BlockingQueue 取东西的操作将会被阻断进入等待状态直到BlocingkQueue 进了新货才会被唤醒。同样,如果 BlockingQueue 是满的任何试图往里存东西的
操作也会被阻断进入等待状态,直到BlockingQueue 里有新的空间才会被唤醒继续操作。
几个常用的实现类:
ArrayBlockingQueue:
规定大小的 BlockingQueue,其构造函数必须带
一个 int 参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。
LinkedBlockingQueue:
大小不定的 BlockingQueue,若其构造函数带一个规定大小的参数,生成的 BlockingQueue 有大小限制,若不带大小参数,所生成的 BlockingQueue 的大小由Integer.MAX_VALUE来决定。其所含的
对象是以FIFO(先入先出)顺序排序的。LinkedBlockingQueue 和ArrayBlockingQueue 比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue 的数据吞吐量要大于 ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于 ArrayBlockingQueue。
PriorityBlockingQueue:
类似于LinkedBlockingQueue,但其所含对象的排序不是 FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator 决定的顺序。
SynchronousQueue:
特殊的BlockingQueue,对其的操作必须是放和取交替完成的。
Exchanger类
顾名思义 Exchanger 让两个线程可以互换信息。用一个例子来解释比较容易。
例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,然后通过 Exchanger 双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水,然后交换,如此周而复始。
Semaphore类
就是一个资源管理器,方便管理自己的资源,如果没有通行证了,线程就进入等待状态用来管理一个资源池的工具,Semaphore 可以看成是个通行证,线程要想从资源池拿到资源必须先拿到通行证,Semaphore 提供的通行证数量和资源池的大小一致。如果线程暂时拿不到通行证,线程就会被阻断进入等待状态
主要方法有:
new Semaphore(size) 构造方法,设置许可数数量
acquire() 获取一个通行证(许可数减一)
release() 归还通行证(许可数加一)

此条目发表在java/j2ee分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据