码迷,mamicode.com
首页 > 其他好文 > 详细

CyclicBarrier

时间:2020-03-20 00:52:09      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:public   对象   read   hang   wait   stat   for   imp   oid   

CyclicBarrier

CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。CyclicBarrier的另一个构造函数CyclicBarrier(int parties, Runnable barrierAction),用于线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。

技术图片

 

 结果

技术图片

 

 


 

Semaphore
Semaphore叫信号量,Semaphore有两个目的,第一个是多个共享资源互斥使用,第二个是并发线程数的控制
代码验证
package conclass;

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {
private static Semaphore semaphore = new Semaphore(3);

public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
new Thread(() -> {
if (semaphore.availablePermits() > 0) {
System.out.println(Thread.currentThread().getName() + "终于有茅坑,可以上厕所");
} else {
System.out.println(Thread.currentThread().getName() + "没有茅坑了");
}
try {
System.out.println(Thread.currentThread().getName()+"申请蹲坑");
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "前面得人终于走了,可以安心的上厕所了");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "舒服,上完了~");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}

 


结果


技术图片

 

 

Exchanger

 



原理

 Exchanger是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是成对的。

       Exchanger类提供了两个方法,String exchange(V x):用于交换,启动交换并等待另一个线程调用exchange;String exchange(V x,long timeout,TimeUnit unit):用于交换,启动交换并等待另一个线程调用exchange,并且设置最大等待时间,当等待时间超过timeout便停止等待。

package conclass;

import javax.swing.*;
import java.util.concurrent.Exchanger;

public class ExchangerDemo {
private static String str1 = "资源1";
private static String str2 = "资源2";

private static Exchanger<String> stringexchanger=new Exchanger<>();
public static void main(String[] args) {
//第一个线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "初始占用资源1");
try {
String nrestr=stringexchanger.exchange(str1);
System.out.println(Thread.currentThread().getName()+"交换资源"+str1);
}catch (InterruptedException e){
e.printStackTrace();

}
}).start();

//第二线程
new Thread(()-> {
System.out.println(Thread.currentThread().getName() + "初始占用资源1");
try {
String nrestr=stringexchanger.exchange(str2);
System.out.println(Thread.currentThread().getName()+"交换资源"+nrestr);
}catch (InterruptedException e){
e.printStackTrace();

}



}).start();

}
}


结果
技术图片

 


 



 

 

 


 


 


 

 

CyclicBarrier

标签:public   对象   read   hang   wait   stat   for   imp   oid   

原文地址:https://www.cnblogs.com/12aa/p/12528407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!