一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JavaExchanger怎么在两个线程间交换数据?详细用法与示例操作步骤

时间:2026-08-05 08:44:49 编辑:袖梨 来源:一聚教程网

java.util.concurrent

包中的

Exchanger

类可用于两个线程之间交换信息。

可简单地将Exchanger对象理解为

一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。

当两个格子中的均被填充时,

该对象会自动将两个格子的信息交换,然后返回给线程,从而实现两个线程的信息交换。

示例代码如下:

package test;import java.util.concurrent.Exchanger;class ExchangerTest extends Thread {    private Exchanger<String> exchanger;    private String string;    private String threadName;    public ExchangerTest(Exchanger<String> exchanger, String string,            String threadName) {        this.exchanger = exchanger;        this.string = string;        this.threadName = threadName;    }    public void run() {        try {            System.out.println(threadName + ": " + exchanger.exchange(string));        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}public class Test {    public static void main(String[] args) {        Exchanger<String> exchanger = new Exchanger<>();        ExchangerTest test1 = new ExchangerTest(exchanger, "string1",                "thread-1");        ExchangerTest test2 = new ExchangerTest(exchanger, "string2",                "thread-2");        test1.start();        test2.start();    }}

此程序创建了两个线程

线程在执行过程中,调用同一个

exchanger

对象的

exchange

方法,进行信息通信,当两个线程均已将信息放入到

exchanger

对象中时,

exchanger

对象会将两个线程放入的信息交换,然后返回,该程序的执行结果如下图:

JavaExchanger怎么在两个线程间交换数据?详细用法与示例教程

另外要留意的是,

Exchanger

类仅可用作两个线程的信息交换,当超过两个线程调用同一个

exchanger

对象时,得到的结果是随机的,

exchanger

对象仅关心其包含的两个“格子”是否已被填充数据,当两个格子都填充数据完成时,该对象就认为线程之间已经配对成功,然后开始执行数据交换操作。

修改上文中的示例代码,在第

33

行之后,再创建一个新线程

test3

,其中线程名称为

thread-3

,用于交换的字符串是

string3

即添加如下的代码:

ExchangerTest test3 = new ExchangerTest(exchanger, "string3","thread-3");test3.start();

此时程序的运行结果是不确定的,多次运行可以发现,配对结果可能是

test1

test3

交换,也可能是

test1

test2

交换,而剩下的未得到配对的线程,则会被阻塞,永久等待,直到与之配对的线程到达位置,对于本程序,则只能强制将其停止。

JavaExchanger怎么在两个线程间交换数据?详细用法与示例教程

总结

热门栏目