blog » Java/J2EE » java多线程编程需要知道的几个类

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() 归还通行证(许可数加一)

This post has already been read 1399 times!

Related posts

RSS 2.0 | leave a response | trackback

发表评论