zoukankan      html  css  js  c++  java
  • 练习题之ExChange

       两个线程可以交换对象的同步点。每个线程都在进入exChange方法时给出某个对象,并接受其他线程返回时给出的对象。用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。

    构造方法摘要
    Exchanger()           创建一个新的 Exchanger。
    方法摘要
    V exchange(V x)           等待另一个线程到达此交换点(除非它被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    V exchange(V x, long timeout, TimeUnit unit)           等待另一个线程到达此交换点(除非它被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。
    public class ExchangerTest {
    
        public static void main(String[] args) {
            ExecutorService service = Executors.newCachedThreadPool();
            final Exchanger exchanger = new Exchanger();
            service.execute(new Runnable(){
                public void run() {
                    try {                
                        Thread.sleep((long)(Math.random()*10000));
                        String data1 = "zxx";
                        System.out.println("线程" + Thread.currentThread().getName() + 
                        "正在把数据" + data1 +"换出去");
                        String data2 = (String)exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName() + 
                        "换回的数据为" + data2);
                    }catch(Exception e){
                        
                    }
                }    
            });
            service.execute(new Runnable(){
                public void run() {
                    try {                
                        Thread.sleep((long)(Math.random()*10000));
                        String data1 = "lhm";
                        System.out.println("线程" + Thread.currentThread().getName() + 
                        "正在把数据" + data1 +"换出去");
                        String data2 = (String)exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName() + 
                        "换回的数据为" + data2);
                    }catch(Exception e){
                        
                    }                
                }    
            });        
        }
    }
    

    运行结果如下:

    线程pool-1-thread-1正在把数据zxx换出去
    线程pool-1-thread-2正在把数据lhm换出去
    线程pool-1-thread-1换回的数据为lhm
    线程pool-1-thread-2换回的数据为zxx
  • 相关阅读:
    Document
    JavaScript
    day6 双向循环及pass、break、continue的使用以及for循环
    day5 isinstance&代码块&分支&while循环
    day4:运算符
    day3:强制类型转换&自动类型转换&变量缓存机制
    day2:Number,tuple,str,list,set,dict
    day1:注释和变量
    线段树区间修改+查询区间和
    Prim/Kruskal求最小生成树
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5536280.html
Copyright © 2011-2022 走看看