zoukankan      html  css  js  c++  java
  • Java多线程与并发库高级应用之线程数据交换Exchanger

    JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。

    Exchanger只提供了一个构造器:
    Exchanger():创建一个新的Exchanger。

    Exchanger中也只有两个方法:
    V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    V exchange(V x, long timeout, TimeUnit unit): 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

    见下面程序
    1. public class ExchangerDemo {  
    2.   
    3.     public static void main(String[] args) {  
    4.           
    5.         //线程池  
    6.         ExecutorService pool = Executors.newCachedThreadPool();  
    7.         //Exchanger  
    8.         final Exchanger<String> changer = new Exchanger<String>();  
    9.           
    10.         //用于交互数据的线程1  
    11.         pool.execute(new Runnable() {  
    12.               
    13.             @Override  
    14.             public void run() {  
    15.                 try{  
    16.                     String data1 = "苹果";  
    17.                     System.out.println(Thread.currentThread().getName() +  
    18.                             "-准备交换数据:" + data1);  
    19.                     Thread.sleep((long)(Math.random()*10000));  
    20.                     String data2 = (String)changer.exchange(data1);  
    21.                     System.out.println(Thread.currentThread().getName() +  
    22.                             "-已交换完数据,交换到的数据:" + data1);  
    23.                 }catch(InterruptedException e){  
    24.                     e.printStackTrace();  
    25.                 }  
    26.             }  
    27.         });  
    28.           
    29.         //用于交互数据的线程2  
    30.         pool.execute(new Runnable() {  
    31.               
    32.             @Override  
    33.             public void run() {  
    34.                 try{  
    35.                     String data1 = "石榴";  
    36.                     System.out.println(Thread.currentThread().getName() +  
    37.                             "-准备交换数据:" + data1);  
    38.                     Thread.sleep((long)(Math.random()*10000));  
    39.                     String data2 = (String)changer.exchange(data1);  
    40.                     System.out.println(Thread.currentThread().getName() +  
    41.                             "-已交换完数据,交换到的数据:" + data1);  
    42.                 }catch(InterruptedException e){  
    43.                     e.printStackTrace();  
    44.                 }  
    45.             }  
    46.         });  
    47.           
    48.         pool.shutdown();  
    49.     }  
    50. }  

    运行程序

    看到两个线程将数据彼此交换。
  • 相关阅读:
    Ubuntu-14.04-QT开发环境搭建-(一)
    解决使用Qt creator时出现Cannot overwrite file ..Permission denied
    Github上关于大数据的开源项目、论文等合集
    Qt5.4中遇到找不到头文件<QApplication>等。
    qt的下载地址
    完整的qt安装教程
    Ubuntu14.04安装Matlab2014a
    Ubuntu14.04安装搜狗输入法的一点小问题
    把OnDraw和OnPaint弄清楚(转贴)
    Ubuntu上挂载源代码,docker容器中共享这个原代码,实现自动部署
  • 原文地址:https://www.cnblogs.com/sfce/p/3701737.html
Copyright © 2011-2022 走看看