zoukankan      html  css  js  c++  java
  • 线程中的同步辅助类Exchanger

    Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

    允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换,尽量不要在多(大于两条)线程之间进行数据的交换.

    Exchanger可能在应用程序(遗传算法和管道设计)中很有用.

    线程之间的数据交换:Exchanger

         允许两条线程之间交换数据。Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换。尽量不要在多(>2)条线程之间进行数据的交换。

    exchange是一个阻塞方法,如果没有其他的线程和它换,就会一直等待着直到有一个线程也调用了exchange方法,然后它们两者交换.

     

    Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用

    如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法,就和其交换数据.

    场景:

    我卖包子,一个哥们要买包子,我把包子给他了.他把钱给我了.

     1 import java.util.Random;
     2 import java.util.concurrent.Exchanger;
     3 import java.util.concurrent.TimeUnit;
     4 
     5 public class ExchangerDemo {
     6 
     7     public static void main(String[] args) {
     8         final Exchanger<String> exchanger = new Exchanger<String>();//String 泛型 是交换的数据的数据类型
     9         //for (int i = 0; i < 3; i++) {//如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法.
    10 
    11             new Thread(new Runnable() {
    12 
    13                 @Override
    14                 public void run() {
    15 
    16                     try {
    17                         System.out.println(Thread.currentThread().getName()
    18                                 + ": 卖包子。。。");
    19                         TimeUnit.SECONDS.sleep(new Random().nextInt(5));
    20                         String data1 = "包子";
    21                         String data2 = exchanger.exchange(data1);//把包子给买包子的人
    22                         System.out.println(Thread.currentThread().getName()
    23                                 + " : 拿到了" + data2);
    24 
    25                     } catch (InterruptedException e) {
    26                         e.printStackTrace();
    27                     }
    28                 }
    29             }).start();
    30 
    31             new Thread(new Runnable() {
    32 
    33                 @Override
    34                 public void run() {
    35 
    36                     try {
    37                         System.out
    38                                 .println("-->"
    39                                         + Thread.currentThread().getName()
    40                                         + ": 买包子。。。");
    41                         TimeUnit.SECONDS.sleep(new Random().nextInt(5));
    42                         String data1 = "10元";
    43                         String data2 = exchanger.exchange(data1);//把钱给卖包子的
    44                         System.out.println(Thread.currentThread().getName()
    45                                 + " : 拿到了" + data2);
    46 
    47                     } catch (InterruptedException e) {
    48                         e.printStackTrace();
    49                     }
    50                 }
    51             }).start();
    52     //    }
    53     }
    54 }

    运行结果:

    1 Thread-0: 卖包子。。。
    2 -->Thread-1: 买包子。。。
    3 Thread-0 : 拿到了10元
    4 Thread-1 : 拿到了包子

    如果把上面的for循环打开:

     1 Thread-0: 卖包子。。。
     2 -->Thread-1: 买包子。。。
     3 Thread-2: 卖包子。。。
     4 -->Thread-3: 买包子。。。
     5 Thread-4: 卖包子。。。
     6 -->Thread-5: 买包子。。。
     7 Thread-5 : 拿到了10元
     8 Thread-3 : 拿到了10元
     9 Thread-2 : 拿到了10元
    10 Thread-1 : 拿到了包子
    11 Thread-4 : 拿到了包子
    12 Thread-0 : 拿到了包子
  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6206350.html
Copyright © 2011-2022 走看看