• 线程间交换数据的Exchanger


    作者:Steven1997
    链接:https://www.jianshu.com/p/9b59829fb191
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

    Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。代码如下:

    package com.thread;  
    import java.util.concurrent.Exchanger;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    
    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 = "a";
                        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 = "b";
                        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正在把数据a换出去  
    	线程pool-1-thread-2正在把数据b换出去  
    	线程pool-1-thread-1换回的数据为b  
    	线程pool-1-thread-2换回的数据为a
  • 相关阅读:
    HTML if条件注释解读
    Springboot整合logback日志系统
    Springboot @Valid 参数校验
    JDK1.8 版的if else
    Android获取手机定位坐标
    CentOS8安装JDK
    Vue全局配置文件
    git学习
    百度前端面试题—基础
    前端知识网络
  • 原文地址:https://www.cnblogs.com/yiweiblog/p/11155223.html
Copyright © 2020-2023  润新知