• 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实现的是一种数据分片的思想,这在大数据情况下将数据分成一定的片段并且多线程执行的情况下有一定的使用价值。

  • 相关阅读:
    oracle的wm_concat()方法与的排序问题,Oracle的 listagg 函数
    sql sever 常用的存储过程的写法或者说与Oracle中存过的异同点
    Oracle游标的使用
    oracle与sql sever的财务月份归属的问题
    sql sever使用习惯
    sqlsever 的存储过程的调试
    sql sever与Oracle的异同点
    单例模式
    线程 ---- 锁(生产者、消费者)
    IO 流理解实例
  • 原文地址:https://www.cnblogs.com/lcngu/p/5218745.html
Copyright © 2020-2023  润新知