• 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. }  

    运行程序

    看到两个线程将数据彼此交换。
  • 相关阅读:
    KindEditor-编辑器配置参数属性
    泛型作为返回类型的写法
    ObservableCollection<T> 类
    常遇到的问题
    实现跨浏览器html5表单验证
    mysql 密码重置
    Web用户的身份验证及WebApi权限验证流程的设计和实现
    Discuz3.2 新用户插入数据库SQL
    3. 深入研究 UCenter API 之 加密与解密(转载)
    window.open实现模式窗口
  • 原文地址:https://www.cnblogs.com/sfce/p/3701737.html
Copyright © 2020-2023  润新知