您的位置:首页 > 编程语言 > Java开发

Java并发基础(六)-Exchanger和Semaphore

2016-10-07 15:28 330 查看

1. Exchanger

Exchanger提供了 一个同步点 , 在这个同步点,两个线程可以交换数据,每个线程通过exchange()方法的入口提供数据给另外的线程,并接收其它线程提供的数据,并返回。

看个简单的例子:

public static void main(String[] args){
final Exchanger exchanger = new Exchanger();
new Thread(new Runnable() {
@Override
public void run() {
System.err.println("我" + "我吧钱给你了");
try {
String result = (String) exchanger.exchange("50块钱");
System.err.println("我收到-->"+result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.err.println("老板"+"等钱到账中");
String result = (String) exchanger.exchange("烟");
System.err.println("老板收到-->"+result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}




可以看到 Exchanger(交换器)的用法还是很简单的。

2. Semaphore

计数信号量。通过acquire()和release()获取和释放访问许可。

public static void main(String[] args){
final Semaphore semaphore = new Semaphore(2);
for (int i = 0; i < 10; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
Thread.sleep(5000);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}


当我们不释放的时候,无法获取信号量的线程无法继续执行

当信号量为1的时候,可以实现线程同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 并发