一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
Exchanger
类Exchanger的作用是让2个线程之间传输数据,它比生产者、消费者模式使用的wait/notify更加方便。
在2个线程之间传递任意数据类型的数据。
方法exchange()阻塞的特性
类Exchanger中的exchange()方法具有阻塞性,调用方法后等待其他线程来获取数据,如果没有其他线程获取数据,则一直阻塞等待。
创建GetThread线程代码如下:
public class GetThread implements Runnable{
private Exchanger<String> exchanger;
public GetThread(Exchanger<String> exchanger){
super();
this.exchanger=exchanger;
}
@Override
public void run() {
try {
System.out.println("在线程getThread中获取线程setThread的值为 "+ exchanger.exchange("setThread"));
System.out.println("线程getThread结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行类代码如下:
public class ExchangerRun {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
GetThread getThread = new GetThread(exchanger);
new Thread(getThread).start();
System.out.println("主进程结束!");
}
}
程序运行结果如下:
Connected to the target VM, address: '127.0.0.1:55200', transport: 'socket'
主进程结束!
创建SetThread线程代码如下:
public class SetThread implements Runnable{
private Exchanger<String> exchanger;
public SetThread(Exchanger<String> exchanger){
super();
this.exchanger=exchanger;
}
@Override
public void run() {
try {
System.out.println("在线程setThread中获取线程getThread的值为 "+ exchanger.exchange("getThread"));
System.out.println("线程setThread结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行类代码如下:
public class ExchangerRun {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
GetThread getThread = new GetThread(exchanger);
SetThread setThread = new SetThread(exchanger);
new Thread(getThread).start();
new Thread(setThread).start();
}
}
程序运行结果如下:
在线程getThread中获取线程setThread的值为 getThread
在线程setThread中获取线程getThread的值为 setThread
线程setThread结束!
线程getThread结束!
方法exchange(V x,long timeout,TimeUnit unit)设置超时
创建GetThread调用exchange()方法设置超时时间代码如下:
public class GetThread implements Runnable{
private Exchanger<String> exchanger;
public GetThread(Exchanger<String> exchanger){
super();
this.exchanger=exchanger;
}
@Override
public void run() {
try {
System.out.println("在线程getThread中获取线程setThread的值为 "+ exchanger.exchange("setThread",5, TimeUnit.SECONDS));
System.out.println("线程getThread结束!");
} catch (InterruptedException | TimeoutException e) {
e.printStackTrace();
}
}
}