zoukankan      html  css  js  c++  java
  • JAVA多线程提高十四:同步工具Exchanger

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

    构造方法摘要 

    Exchanger() 创建一个新的 Exchanger。

    方法摘要

    CountDownLatchCyclicBarrier
    V exchange(V x) 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    V exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

    代码示例 

    交换操作必须是成双成对的,如果线程是奇数操作,那么两个会交换成功,另一个会一直等待交换。

    复制代码
    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<String>();
            service.execute(new Runnable() {
    
                public void run() {
                    try {
                        String data1 = "zxx";
                        System.out.println("线程" + Thread.currentThread().getName()
                                + "正在把数据" + data1 + "换出去");
                        Thread.sleep((long) Math.random() * 10000);
    
                        String data2=(String) exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName()
                                + "换回的数据为" + data2);
                    } catch (Exception e) {
    
                        e.printStackTrace();
                    }
                }
            });
    
            service.execute(new Runnable() {
    
                public void run() {
                    try {
                        String data1 = "lhm";
                        System.out.println("线程" + Thread.currentThread().getName()
                                + "正在把数据" + data1 + "换出去");
                        Thread.sleep((long) Math.random() * 10000);
    
                        String data2=(String) exchanger.exchange(data1);
                        System.out.println("线程" + Thread.currentThread().getName()
                                + "换回的数据为" + data2);
                    } catch (Exception e) {
    
                        e.printStackTrace();
                    }
                }
            });
            service.shutdown();
        }
    }
    复制代码
  • 相关阅读:
    (转载)直接用SQL语句把DBF导入SQLServer
    (转载)SQLServer存储过程返回值总结
    (转载)MS SQL Server 未公开的加密函数有哪些?
    (转载)SQL语句,纵列转横列
    (转载)直接用SQL语句把DBF导入SQLServer
    (转载)用SQL语句创建Access表
    (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
    (转载)sql语句解决分页问题
    (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
    (转载)异构数据库之间完全可以用SQL语句导数据
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/13409337.html
Copyright © 2011-2022 走看看