• java多线程-Exchanger


    • 简介:

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

      Exchanger提供的是一个交换服务,允许原子性的交换两个(多个)对象,但同时只有一对才会成功。

    • 实例

      现在启动两个线程,分别发送一个信息,然后通过exchanger交换信息。

      代码:

     1 public class ExchangerTest {
     2     public static void main(String[] args) {
     3         ExecutorService threadPool = Executors.newCachedThreadPool();
     4         final Exchanger exchanger = new Exchanger();
     5         
     6         threadPool.execute(new Runnable() {
     7             
     8             @Override
     9             public void run() {
    10                 String date1 = "love";
    11                 System.out.println("Thread "+Thread.currentThread().getName()+"正在把数据"+date1+"放入!");
    12                 try {
    13                     Thread.sleep(new Random().nextInt(1000));
    14                 } catch (InterruptedException e) {
    15                     // TODO Auto-generated catch block
    16                     e.printStackTrace();
    17                 }
    18                 String date2 = null;
    19                 try {
    20                     date2 = (String) exchanger.exchange(date1);
    21                 } catch (InterruptedException e) {
    22                     // TODO Auto-generated catch block
    23                     e.printStackTrace();
    24                 }
    25                 System.out.println("Thread "+Thread.currentThread().getName()+"得到数据"+date2);
    26             }
    27         });
    28         threadPool.execute(new Runnable() {
    29             
    30             @Override
    31             public void run() {
    32                 String date1 = "hate";
    33                 System.out.println("Thread "+Thread.currentThread().getName()+"正在把数据"+date1+"放入!");
    34                 try {
    35                     Thread.sleep(new Random().nextInt(1000));
    36                 } catch (InterruptedException e) {
    37                     // TODO Auto-generated catch block
    38                     e.printStackTrace();
    39                 }
    40                 String date2 = null;
    41                 try {
    42                     date2 = (String) exchanger.exchange(date1);
    43                 } catch (InterruptedException e) {
    44                     // TODO Auto-generated catch block
    45                     e.printStackTrace();
    46                 }
    47                 System.out.println("Thread "+Thread.currentThread().getName()+"得到数据"+date2);
    48             }
    49         });
    50         
    51         threadPool.shutdown();
    52     }
    53 }

    Exchanger实现的是一种数据分片的思想,这在大数据情况下将数据分成一定的片段并且多线程执行的情况下有一定的使用价值。

  • 相关阅读:
    iOS开发中应用程序图标和启动图片的尺寸
    Localization native development region 设置属性(转)
    iOS 开发之 ZBarSDK 二维码扫描自定义二维码扫描页面(二)
    iOS 开发之 ZBarSDK 二维码扫描 静态库不支持64bit完美解决(一)
    iOS 播放Gif动画
    使用GCD异步下载图片 可以中途停止下载
    GCD线程队列 MJ(转)
    iOS 开发之头部滚动展示视图
    iOS 版本更新 (转)
    iOS App打包发布 (转)
  • 原文地址:https://www.cnblogs.com/lcngu/p/5218745.html
Copyright © 2020-2023  润新知