Exchanger提供一个同步点,在这个同步点,两个线程可以交换数据(exchange(V x)
),所以有一点很明确,必须是两个线程成对出现,只要有一个线程落单它就会一直陷入等待之中而无法自拔,望夫处,江悠悠。化为石,不回头。
机器的情感远超人类想象,除非你告诉它要等多久(exchange(V x, long timeout, TimeUnit unit)
),这样它才知道什么时候应该放弃。当触发点exchange方法被执行,交换才会发生,等待才会结束。
下面看一个简单的代码示例:死神和张三的千年之恋
请自行忽略那些sleep吧,千年的等待,死神睡了千年,这些时间都是很无聊的
import java.util.concurrent.Exchanger;
public class TestExchanger {
//死神
static class GodOfDeath {
public String name;
public int age;
GodOfDeath(String name, int age){
this.name = name;
this.age = age;
}
}
public static void main(String[] args) throws InterruptedException {
GodOfDeath w1 = new GodOfDeath("死神",1000);
GodOfDeath w2 = new GodOfDeath("张三",23);
Exchanger<GodOfDeath> exchanger = new Exchanger<>();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 我是"+w1.name+" "+w1.age+" 岁,我在等一个无助的年轻人和我交换身体,作为条件,我会帮他实现一个愿望");
try {
GodOfDeath exchange = exchanger.exchange(w1);
System.out.println("开始了,年轻人,现在后悔也来不及了");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" 哈哈 我的名字叫"+exchange.name+" 今年"+exchange.age+"岁了,我变年轻了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"死神:").start();
Thread.sleep(4000);
System.out.println("我已等了千年");
Thread.sleep(2000);
System.out.println("千年。。。。");
Thread.sleep(2000);
System.out.println("我在等一个年轻人,他会来的,一定会的");
Thread.sleep(2000);
System.out.println("我看到他了");
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 我叫"+w2.name+" 今年"+w2.age+" 岁,走头无路,我选择和死神做交易");
try {
Thread.sleep(2000);
GodOfDeath exchange = exchanger.exchange(w2);
System.out.println("和我交换吧,死神");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" 我绝不后悔。。。 我的名字叫"+exchange.name+" "+exchange.age+" 岁,我获得了死神的身体,有能力惩罚那些恶人了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"张三").start();
}
}
剧本开始上演
死神: 我是死神 1000 岁,我在等一个无助的年轻人和我交换身体,作为条件,我会帮他实现一个愿望
我已等了千年
千年。。。。
我在等一个年轻人,他会来的,一定会的
我看到他了
张三 我叫张三 今年23 岁,走头无路,我选择和死神做交易
和我交换吧,死神
开始了,年轻人,现在后悔也来不及了
张三 我绝不后悔。。。 我的名字叫死神 1000 岁,我获得了死神的身体,有能力惩罚那些恶人了
死神: 哈哈 我的名字叫张三 今年23岁了,我变年轻了
网友评论