1.Exchanger作用
主要是用户线程间通信
2.常用API
Method | Description |
---|---|
V exchange(V x) | Waits for another thread to arrive at this exchange point (unless the current thread is interrupted), and then transfers the given object to it, receiving its object in return. |
V exchange(V x, long timeout, TimeUnit unit) | Waits for another thread to arrive at this exchange point (unless the current thread is interrupted or the specified waiting time elapses), and then transfers the given object to it, receiving its object in return. |
3.线程间通信交换数据Demo
public class TempDemo {
public static void main(String[] args) throws Exception {
Exchanger<String> exchanger = new Exchanger<>();
Thread threadA = new Thread(()->{
try {
String threadBData = exchanger.exchange("ThreadA Content");
System.out.println(Thread.currentThread().getName() + " --->" + threadBData);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.setName("threadA");
Thread threadB = new Thread(()->{
try {
String threadAData = exchanger.exchange("ThreadB Content");
System.out.println(Thread.currentThread().getName() + " --->" + threadAData);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadB.setName("threadB");
threadA.start();
threadB.start();
threadA.join();
threadB.join();
}
}
# 当前线程可被中断Demo
public class TempDemo {
public static void main(String[] args) throws Exception {
Exchanger<String> exchanger = new Exchanger<>();
Thread threadA = new Thread(()->{
try {
String threadBData = exchanger.exchange("ThreadA Content");
System.out.println(Thread.currentThread().getName() + " --->" + threadBData);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.setName("threadA");
Thread threadB = new Thread(()->{
try {
Thread.sleep(5000);
String threadAData = exchanger.exchange("ThreadB Content", 2, TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName() + " --->" + threadAData);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
});
threadB.setName("threadB");
threadA.start();
threadB.start();
threadA.interrupt();
threadB.join();
}
}