设为首页 收藏本站
查看: 709|回复: 0

[经验分享] Java并发编程--6.Exchanger线程间交换数据

[复制链接]

尚未签到

发表于 2017-7-2 17:49:31 | 显示全部楼层 |阅读模式
  在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中
  在生产者-消费者情境模式中它包含了一个数缓冲区,一个或者多个生产者,一个或者多个消费中
  下面是生产者和消费者的示例:



/**
* 生产者和消费者交换数据
*/
public class MyExchanger {
public static void main(String[] args) {
Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
Producer1 producer = new Producer1(new ArrayList<String>(), exchanger);
Consumer1 consumer = new Consumer1(new ArrayList<String>(), exchanger);
new Thread(producer).start();
new Thread(consumer).start();
}
}
/** 生产者线程*/
class Producer1 implements Runnable{
/**
* 存储交换的数据
*/
private List<String> buffer;
/**
* 和消费者要交换的对象
*/
private final Exchanger<List<String>> exchanger;
Producer1(List<String> buffer,Exchanger<List<String>> exchanger){
this.buffer = buffer;
this.exchanger = exchanger;
}
@Override
public void run() {
for(int i = 0 ; i < 2 ; i++){
String message = "" + i ;
System.out.println("Produce的数据 : " + message);
buffer.add(message);
//调用exchange()与消费者进行数据交换
try {
buffer = exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Produce收到来自Consumer的数据的长度 : " + buffer.size());
}
}
/** 消费者线程*/
class Consumer1 implements Runnable{
private List<String> buffer;
private final Exchanger<List<String>> exchanger;
public Consumer1(List<String> buffer,Exchanger<List<String>> exchanger){
this.buffer = buffer;
this.exchanger = exchanger;
}
@Override
public void run() {
for(int i = 0 ; i < 2 ; i++){
//调用exchange()与消费者进行数据交换
try {
buffer = exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j = 0 ; j < buffer.size() ; j++){
System.out.println("Consumer收到来自Produce的数据 : " + buffer.get(0));
buffer.remove(0);
}
}
System.out.println("Consumer清空数据");
}
}
  控制台输出:



Produce的数据 : 0
Consumer收到来自Produce的数据 : 0
Produce的数据 : 1
Produce收到来自Consumer的数据的长度 : 0
Consumer收到来自Produce的数据 : 1
Consumer清空数据
  在Exchanger中,如果一个线程已经到达了exchanger节点时,对于它的伙伴节点的情况有三种:
  1、如果它的伙伴节点在该线程到达之间已经调用了exchanger方法,则它会唤醒它的伙伴然后进行数据交换,得到各自数据返回。
  2、如果它的伙伴节点还没有到达交换点,则该线程将会被挂起,等待它的伙伴节点到达被唤醒,完成数据交换。
  3、如果当前线程被中断了则抛出异常,或者等待超时了,则抛出超时异常

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390521-1-1.html 上篇帖子: 每日编程-20170321 下篇帖子: 无缓存交换
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表