package com.tkp.lock;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* Exchanger<V> 类,交换器
* 1.java.util.concurrent.Exchanger
*
* 2.构造方法
* public Exchanger()
* 3.常用API方法
* public V exchange(V x) throws InterruptedException 交换方法
* public V exchange(V x, long timeout, TimeUnit unit)throws InterruptedException, TimeoutException
* 指定延时时间,一旦超时则抛出TimeoutException异常,且不会交换数据
*
* 4.特点
* Exchanger(交换器)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换
* 传递形式参数与泛型一致;形参:互换的数据
* 返回值与泛型一致;返回值:交换后收到 的数据
*/
public class ExchangerDemo {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
new Thread(new BoyThread(exchanger), "张三丰").start();
new Thread(new GirlThread(exchanger), "李小花").start();
}
}
class BoyThread implements Runnable{
private Exchanger<String> exchanger;
public BoyThread(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
//互换礼物
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(5);
String str = exchanger.exchange("礼物A");
System.out.println(Thread.currentThread().getName() +"收到:"+str);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class GirlThread implements Runnable{
Exchanger<String> exchanger;
public GirlThread(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
//互换礼物
@Override
public void run() {
try {
String str = exchanger.exchange("礼物B");//一直等待交换
// String str = exchanger.exchange("礼物B", 1, TimeUnit.SECONDS); //指定等待时间,超时就抛异常,且终止交换
System.out.println(Thread.currentThread().getName() + "收到:"+str);
} catch (InterruptedException e) {
e.printStackTrace();
} /*catch (TimeoutException e) {
// e.printStackTrace();
System.out.println("没有收到礼物,不开心!");
}*/
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交