线程的并发工具类(5)---Exchanger

电玩女神 2023-07-16 03:37 129阅读 0赞

Exchanger的使用

          1. Exchanger介绍
            • 1.1 用法场景
            • 1.2 原理
          1. Exchanger使用

1. Exchanger介绍

Exchanger使用的比较少,这里只做了解。
Exchanger:两个线程之间的数据交换。

1.1 用法场景

两个线程之间的数据交换。

1.2 原理

初始化Exchanger实例,在两个线程ThreadOne()和ThreadTwo()中分别调用exchange()方法,当两个线程都运行到exchange()的时候数据会进行交换,改变初始化的数据。只涉及到两个线程,所以使用场景比较受局限。

2. Exchanger使用

Exchanger使用很简单,主要是依靠了exchange(V)方法实现的,该方法也是一个阻塞方法。具体代码:

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.concurrent.Exchanger;
  5. /** * Exchanger:两个线程内的数据交换 */
  6. public class UseExchange {
  7. static Exchanger<String[]> exchanger = new Exchanger<>();
  8. static class ThreadOne implements Runnable {
  9. @Override
  10. public void run() {
  11. String[] list = new String[]{ "你好1","你好2","你好3","你好4"};
  12. try {
  13. System.out.println("线程"+Thread.currentThread().getName()+"交换之前的数据为"+ Arrays.toString(list));
  14. list = exchanger.exchange(list);
  15. System.out.println("线程"+Thread.currentThread().getName()+"交换之后的数据为"+Arrays.toString(list));
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. static class ThreadTwo implements Runnable {
  22. @Override
  23. public void run() {
  24. String[] list = new String[]{ "我好1","我好2","我好3","我好4"};
  25. try {
  26. System.out.println("线程"+Thread.currentThread().getName()+"交换之前的数据为"+Arrays.toString(list));
  27. list = exchanger.exchange(list);
  28. System.out.println("线程"+Thread.currentThread().getName()+"交换之后的数据为"+Arrays.toString(list));
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. public static void main(String[] args) {
  35. new Thread(new ThreadOne()).start();
  36. try {
  37. Thread.sleep(3000);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. new Thread(new ThreadTwo()).start();
  42. }
  43. }

运行结果:

  1. 线程Thread-0交换之前的数据为[你好1, 你好2, 你好3, 你好4]
  2. 线程Thread-1交换之前的数据为[我好1, 我好2, 我好3, 我好4]
  3. 线程Thread-1交换之后的数据为[你好1, 你好2, 你好3, 你好4]
  4. 线程Thread-0交换之后的数据为[我好1, 我好2, 我好3, 我好4]

因为Exchanger很少使用,这里只做了解。

发表评论

表情:
评论列表 (有 0 条评论,129人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线并发工具

    Fork-Join 什么是分而治之? 规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到