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

  • 相关阅读:
    js 手机端触发事事件、javascript手机端/移动端触发事件
    行高引起的行内块级元素间距
    js实现复制功能
    encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别
    CSS动画总结效果
    CSS属性之word-break:break-all强制性换行
    在handlebars.js {{#if}}条件下的逻辑运算符解决方案
    js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper
    垂直方向兼容显示的内容多少的情况样式Flex布局
    实现div里的img图片水平垂直居中
  • 原文地址:https://www.cnblogs.com/lcngu/p/5218745.html
Copyright © 2011-2022 走看看