【java】多线程控制(一)---Semaphore、Exchanger、CyclicBarrier、CountDownLatch

来源:互联网 发布:昆明行知中学校花 编辑:程序博客网 时间:2024/06/05 05:49

【Semaphore】

简单说明:信号灯,可以控制某个资源可被同时访问的个数。

使用方法:

1、new一个实例:Semapore sp = new Semapore(num);    // num 是可以呗同时访问的数目。

2、需要访问某个资源前,调用acquire(), 尝试获取访问许可,如果访问数达到上限,此线程就会被挂起。

3、使用资源后,调用release() ,解除锁定,此时如果有被挂起的线程,就会被唤醒并获得访问许可。

 

【Exchanger】

简单说明:Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。

使用方法:

1、new一个实例:Exchanger exchanger = new Exchanger(); 

2、在第一个线程中,在需要交换的数据的位置,调用exchange(data1),此时线程会被挂起,等待第二个线程也调用交换数据的方法。

3、在第二个线程中,在需要交换的数据的位置,调用exchange(data2),此时两个数据交换完成,两个线程均继续执行。

 

【CyclicBarrier】

简单说明:CyclicBarrier允许一组线程互相等待,直到到达某个标记点。

使用方法:

1、new一个实例:CyclicBarrier cb = new CyclicBarrier(num);    // 互相等待的线程数目

2、在需要集合等待其他线程的位置调用await(),这时这个线程会被挂起,直到调用await()的数目达到num后,继续执行。

ps:同一个线程中可以设置多个集合点。

 

【CountDownLatch】

简单说明:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

使用方法:

1、new一个实例:CountDownLatch cd = new CountDownLatch(num);   //计数器的数目

2、一个完成任务的线程需要调用countDown(),以此使计数器的数目自减1。

3、需要等待的线程需要调用await(),当计数器减为0后,此线程继续执行。

ps:CountDownLatch只能使用一次,如果有更多的地方也需要这种等待机制,需要建立更多的CountDownLatch。

 

 

 

 

 

0 0
原创粉丝点击