首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程編程:Exchanger 數據交換實戰詳解

     編輯:Java 相關知識

Exchanger 核心機制

Exchanger 是 Java 並發包中用於雙線程數據交換的同步工具。它提供一個同步點,兩個線程分別調用 exchange() 方法,第一個到達的線程會阻塞,直到第二個線程到達,隨後雙方交換數據並繼續執行。

代碼實例

package com.ljq.test.thread;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExchangerTest {
    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final Exchanger exchanger = new Exchanger<>();

        // 線程 A:發送 "張三"
        service.execute(() -> {
            try {
                String data1 = "張三";
                System.out.println("線程 " + Thread.currentThread().getName() + " 正在發送數據:" + data1);
                Thread.sleep((long) (Math.random() * 10000));
                String data2 = exchanger.exchange(data1);
                System.out.println("線程 " + Thread.currentThread().getName() + " 收到數據:" + data2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        // 線程 B:發送 "李四"
        service.execute(() -> {
            try {
                String data1 = "李四";
                System.out.println("線程 " + Thread.currentThread().getName() + " 正在發送數據:" + data1);
                Thread.sleep((long) (Math.random() * 10000));
                String data2 = exchanger.exchange(data1);
                System.out.println("線程 " + Thread.currentThread().getName() + " 收到數據:" + data2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        service.shutdown();
    }
}

執行結果示例

線程 pool-1-thread-1 正在發送數據:張三
線程 pool-1-thread-2 正在發送數據:李四
線程 pool-1-thread-1 收到數據:李四
線程 pool-1-thread-2 收到數據:張三

關鍵點總結

  • Exchanger 適用於雙方互相需要對方數據的場景,如雙緩衝、管道流處理。
  • exchange() 會阻塞直到配對線程到達,若需超時控制可使用 exchange(V, timeout, TimeUnit)。
  • 泛型參數確保類型安全,避免強制轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved