zoukankan      html  css  js  c++  java
  • Exchanger的使用

      两个线程可以交换对象的同步点。每个线程都在进入 exchange 方法时给出某个对象,并接受其他线程返回时给出的对象。

      用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
    构造方法摘要
    Exchanger()
              创建一个新的 Exchanger。
     
    方法摘要
    V exchange(V x)
              等待另一个线程到达此交换点(除非它被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    V exchange(V x, long timeout, TimeUnit unit)
              等待另一个线程到达此交换点(除非它被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。
     
     1 package com.thread;
     2 import java.util.concurrent.Exchanger;
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 
     6 public class ExchangerTest {
     7 
     8     public static void main(String[] args) {
     9         ExecutorService service = Executors.newCachedThreadPool();
    10         final Exchanger exchanger = new Exchanger();
    11         service.execute(new Runnable(){
    12             public void run() {
    13                 try {                
    14                     Thread.sleep((long)(Math.random()*10000));
    15                     String data1 = "zxx";
    16                     System.out.println("线程" + Thread.currentThread().getName() + 
    17                     "正在把数据" + data1 +"换出去");
    18                     String data2 = (String)exchanger.exchange(data1);
    19                     System.out.println("线程" + Thread.currentThread().getName() + 
    20                     "换回的数据为" + data2);
    21                 }catch(Exception e){
    22                     
    23                 }
    24             }    
    25         });
    26         service.execute(new Runnable(){
    27             public void run() {
    28                 try {                
    29                     Thread.sleep((long)(Math.random()*10000));
    30                     String data1 = "lhm";
    31                     System.out.println("线程" + Thread.currentThread().getName() + 
    32                     "正在把数据" + data1 +"换出去");
    33                     String data2 = (String)exchanger.exchange(data1);
    34                     System.out.println("线程" + Thread.currentThread().getName() + 
    35                     "换回的数据为" + data2);
    36                 }catch(Exception e){
    37                     
    38                 }                
    39             }    
    40         });        
    41     }
    42 }

    运行结果如下:

    线程pool-1-thread-1正在把数据zxx换出去
    线程pool-1-thread-2正在把数据lhm换出去
    线程pool-1-thread-1换回的数据为lhm
    线程pool-1-thread-2换回的数据为zxx
     
     
     
  • 相关阅读:
    机器学习的定义和分类
    选股
    mysql修改密码
    快速排序
    php的错误类型
    MySQL数据库优化
    库存超卖问题
    循环处理
    kafka安装配置
    JavaScript、jQuery杂记
  • 原文地址:https://www.cnblogs.com/liuling/p/2013-8-21-02.html
Copyright © 2011-2022 走看看