ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程交换数据

2022-06-22 15:32:01  阅读:111  来源: 互联网

标签:Thread 数据 交换 System 线程 Exchanger println data


Exchanger 简介:

Exchanger 提供了两个公开方法:

 

 1、只带泛型 V(交换的数据对象)的方法,线程一直阻塞,直到其他任意线程和它交换数据,或者被线程中断;

2、另外一个带时间的方法,如果超过设置时间还没有线程和它交换数据,就会抛出 TimeoutException 异常;

 

private static void test1() {
    Exchanger exchanger = new Exchanger();

    new Thread(() -> {
        try {
            Object data = "-公众号Java技术栈AAA";
            System.out.println(Thread.currentThread().getName() + data);

            // 开始交换数据
            data = exchanger.exchange(data);
            System.out.println(Thread.currentThread().getName() + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();

    new Thread(() -> {
        try {
            Object data = "-公众号Java技术栈BBB";
            System.out.println(Thread.currentThread().getName() + data);

            // 开始交换数据
            data = exchanger.exchange(data);
            System.out.println(Thread.currentThread().getName() + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}

这段代码的逻辑:

1、创建并启动两个线程;

2、进行数据交换前先打印出自己线程的数据;

3、进行数据交换;

4、打印数据交换之后的数据;

输出结果:

从结果可以看出,线程 0、1 分别先打印出 A、B,数据交换之后,打印出了 B、A,数据交换正常!

 

超时数据交换

上面演示了两个线程的正常交换,下面再来一个带超时的示例:

private static void test2() {
    Exchanger exchanger = new Exchanger();

    new Thread(() -> {
        try {
            Object data = "-公众号Java技术栈AAA";
            System.out.println(Thread.currentThread().getName() + data);

            // 开始交换数据
            data = exchanger.exchange(data, 3000L, TimeUnit.MILLISECONDS);
            System.out.println(Thread.currentThread().getName() + data);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();
}

现在只启动了一个线程,并且设置了超时时间 3 秒。

输出结果:

 

 

首先线程输出了自己的数据,然后 3 秒后,并没有其他线程和它交换数据,所以抛出了超时异常,最后线程结束运行。

 

中断数据交换

线程开始交换数据后,会一直阻塞直到其他任意线程和它交换数据,或者被中断、超时

private static void test3() throws InterruptedException {
    Exchanger exchanger = new Exchanger();

    Thread thread = new Thread(() -> {
        try {
            Object data = "-公众号Java技术栈AAA";
            System.out.println(Thread.currentThread().getName() + data);

            // 开始交换数据
            data = exchanger.exchange(data);
            System.out.println(Thread.currentThread().getName() + data);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

    thread.start();

    // 线程中断
    Thread.sleep(3000L);
    thread.interrupt();
}

主线程休眠 3 秒后,中断该线程。

输出结果:

 

 

输出结果 3 秒后,线程被中断了,抛出了中断异常,线程也停止阻塞,最后线程结束运行。

标签:Thread,数据,交换,System,线程,Exchanger,println,data
来源: https://www.cnblogs.com/KL2016/p/16400768.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有