博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发:线程间数据传递和交换
阅读量:6230 次
发布时间:2019-06-21

本文共 3011 字,大约阅读时间需要 10 分钟。

转自:

一、通过SynchronousQueue方式实现线程间数据传递:

  线程A与线程B共同持有一个SynchronousQueue的引用,线程B调用take方法,阻塞以等待; 线程A运行后计算出结果,将结果put到queue中;

public class SynchronousQueueTest {    public static void main(String[] args) throws InterruptedException {        SynchronousQueue
queue = new SynchronousQueue
(); //线程A putThread Thread putThread = new Thread(new Runnable() { @Override public void run() { System.out.println("put thread start"); try { Thread.sleep(3000); System.out.println("put thread put对象"); queue.put(1); } catch (InterruptedException e) { } System.out.println("put thread end"); } }); //线程B takeThread Thread takeThread = new Thread(new Runnable() { @Override public void run() { System.out.println("take thread start"); try { System.out.println("take thread 等待put对象"); System.out.println("take from putThread: " + queue.take()); } catch (InterruptedException e) { } System.out.println("take thread end"); } }); putThread.start(); takeThread.start(); }}

 二、线程Exchanger工具类实现线程间的数据交换:

  当一个线程到达exchange调用点时,如果它的伙伴线程此前已经调用了此方法,那么它的伙伴会被调度唤醒并与之进行对象交换,然后各自返回。如果它的伙伴还没到达交换点,那么当前线程将会被挂起,直至伙伴线程到达——完成交换正常返回;或者当前线程被中断——抛出中断异常;又或者是等候超时——抛出超时异常。

public class ExchangerTest {    public static void main(String[] args) {        ExecutorService service = Executors.newCachedThreadPool();        final Exchanger exchanger = new Exchanger();        service.execute(new Runnable(){            public void run() {                try {                                    String data1 = "thread-1-data";                    System.out.println("线程" + Thread.currentThread().getName() +"正在把数据" + data1 +"换出去");                    Thread.sleep((long)(Math.random()*10000));                    String data2 = (String)exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);                }catch(Exception e){                                    }            }            });        service.execute(new Runnable(){            public void run() {                try {                                    String data1 = "thread-2-data";                    System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去");                    Thread.sleep((long)(Math.random()*10000));                                        String data2 = (String)exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);                }catch(Exception e){                                    }                            }            });            }}

转载于:https://www.cnblogs.com/sharpest/p/10559519.html

你可能感兴趣的文章
用matplotlib绘制图像
查看>>
flex 整理 笔记
查看>>
Cocos2d-x之瓦片地图 Tiled
查看>>
对网卡中断绑定的脚本
查看>>
Android第二次作业
查看>>
Trie
查看>>
(Joomla)多功能健康模块
查看>>
基于CC2530的zigbee信道、PANID扫描设备
查看>>
前端基础之jquery
查看>>
You are beautiful
查看>>
GIS部分理论知识备忘随笔
查看>>
应用安装和卸载
查看>>
CSS深入理解学习笔记之border
查看>>
查找并替换中文字符
查看>>
GRU(Gated Recurrent Unit) 更新过程推导及简单代码实现
查看>>
inline和宏之间的区别
查看>>
Ext文本框添加清除图标,
查看>>
MySql取得日期(前一天、某一天)
查看>>
我们系统中最常见声卡驱动问题和解决
查看>>
hibernate篇章五--Hibernage工作原理
查看>>