• 高级同步器:交换器Exchanger


    引自:https://blog.csdn.net/Dason_yu/article/details/79764467

    一、定义
    每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。

    内存一致性效果:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。(内存一致性效果被称为happen-before),简单的例子:当一个线程进行写入操作,另一个线程进行读取操作,保证一个线程写入的结果对另一个线程的读取是可视的。

    二、用法

    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<String> exchanger = new Exchanger<>();
            service.execute(new Runnable() {
                public void run() {
                    try {
                        String data1 = "恭喜发财!";
                        System.out.println("线程" + Thread.currentThread().getName() + "正在把数据:" + data1 + "换出去");
                        Thread.sleep((long) (Math.random() * 10000));
                        String data2 = exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为:" + data2);
                    } catch (Exception e) {
    
                    }
                }
            });
            service.execute(new Runnable() {
                public void run() {
                    try {
    
                        String data1 = "乖,给你一个红包!";
                        System.out.println("线程" + Thread.currentThread().getName() + "正在把数据:" + data1 + "换出去");
                        Thread.sleep((long) (Math.random() * 10000));
                        String data2 = exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为:" + data2);
                    } catch (Exception e) {
    
                    }
                }
            });
            service.shutdown();
        }
    }
  • 相关阅读:
    Messy Code in Windows Server 2008 R2 English Edition
    Office Web Apps Server(1)
    How to add a webpart to your website
    How to Upload multiple files to documentLibrary in one time
    [刘阳Java]_SpringMVC文件上传第1季_第10讲
    [刘阳Java]_SpringMVC访问静态资源_第9讲
    react单组件 渲染页面
    react组件传值传方法
    react组件选项卡demo
    react组件
  • 原文地址:https://www.cnblogs.com/x-jingxin/p/10649995.html
Copyright © 2020-2023  润新知