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

    运行程序

    看到两个线程将数据彼此交换。
  • 相关阅读:
    maven安装以及eclipse配置maven
    jquery 图片文件转base64 显示
    Java 解析Excel文件为JSON
    Dropwizard框架入门
    使用Spring Security和OAuth2实现RESTful服务安全认证
    SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
    13个可实现超棒数据可视化效果的Javascript框架
    C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
    C#使用RSA证书文件加密和解密示例
    C# 中使用 RSA加解密算法
  • 原文地址:https://www.cnblogs.com/sfce/p/3701737.html
Copyright © 2011-2022 走看看