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
     
     
     
  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/liuling/p/2013-8-21-02.html
Copyright © 2011-2022 走看看