Java并发编程线程间通讯实现过程详解

 更新时间:2020年05月13日 15:31:40   作者:玄同太子  
这篇文章主要介绍了Java并发编程线程间通讯实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在Java中线程间通讯有多种方式,我这里列出一些常用方式,并用代码的方式展示他们是如何实现的:

  • 共享变量
  • wait, notify,notifyAll(这3个方法是Object对象中的方法,且必须与synchronized关键字结合使用)
  • CyclicBarrier、CountDownLatch
  • 利用LockSupport
  • Lock/Condition机制
  • 管道,创建管道输出流PipedOutputStream和管道输入流PipedInputStream

示例一:

package com.zhi.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

import org.junit.Test;

/**
 * Java多线程-线程通讯示例<br>
 * flag作为共享变量JobB执行,notify通知Job执行,CountDownLatch通知主线程执行
 * 
 * @author 张远志
 * @since 2020年5月4日21:51:24
 *
 */
public class ThreadTest2 {
  private CountDownLatch latch;
  private volatile boolean flag = true;
  private Object lock = new Object();
  private AtomicInteger num = new AtomicInteger(0);

  class JobA implements Runnable {
    @Override
    public void run() {
      synchronized (lock) {
        flag = false;
        if (num.get() != 3) {
          try {
            lock.wait(); // wait方法会释放锁
          } catch (InterruptedException e) {
          }
        }
        System.out.println("任务A收到通知,继续执行作业");
      }
      latch.countDown();
    }
  }

  class JobB implements Runnable {
    @Override
    public void run() {
      while (flag) { // 保证JobA先申请到锁

      }
      synchronized (lock) {
        for (int i = 1; i <= 5; i++) {
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
          }
          int a = num.incrementAndGet();
          System.out.println("任务B第" + i + "次执行,num值为:" + a);
          if (a == 3) {
            lock.notify(); // 唤醒JobB线程,notify方法不会释放锁
          }
        }
      }
      latch.countDown();
    }
  }

  @Test
  public void test() {
    latch = new CountDownLatch(2);
    new Thread(new JobA()).start();
    new Thread(new JobB()).start();
    try {
      latch.await(); // 保证2个线程都执行完毕
    } catch (InterruptedException e) {
    }
  }
}

结果输出:

任务B第1次执行,num值为:1
任务B第2次执行,num值为:2
任务B第3次执行,num值为:3
任务B第4次执行,num值为:4
任务B第5次执行,num值为:5
任务A收到通知,继续执行作业

示例二:

package com.zhi.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.LockSupport;

import org.junit.Test;

/**
 * Java多线程-线程通讯示例,利用LockSupport
 * 
 * @author 张远志
 * @since 2020年5月4日21:51:24
 *
 */
public class ThreadTest3 {
  private CountDownLatch latch;
  private volatile int num = 0;
  private Thread ta;
  private Thread tb;

  class JobA implements Runnable {
    @Override
    public void run() {
      if (num != 3) {
        LockSupport.park();
      }
      System.out.println("任务A收到通知,继续执行作业");
      latch.countDown();
    }
  }

  class JobB implements Runnable {
    @Override
    public void run() {
      for (int i = 1; i <= 5; i++) {
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        num++;
        System.out.println("任务B第" + i + "次执行,num值为:" + num);
        if (num == 3) {
          LockSupport.unpark(ta); // unpark会立即激活传入线程
        }
      }
      latch.countDown();
    }
  }

  @Test
  public void test() {
    latch = new CountDownLatch(2);
    ta = new Thread(new JobA());
    tb = new Thread(new JobB());
    ta.start();
    tb.start();
    try {
      latch.await(); // 保证2个线程都执行完毕
    } catch (InterruptedException e) {
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java结合uniapp实现验证码功能的示例详解

    Java结合uniapp实现验证码功能的示例详解

    UniApp 是一个基于 Vue.js 的跨平台应用开发框架,允许开发者使用统一的代码库来构建多平台应用,这篇文章将给大家介绍Java结合uniapp实现验证码功能,文中通过详细的代码示例讲解的非常详细,需要的朋友可以参考下
    2024-07-07
  • Spring Cloud 专题之Sleuth 服务跟踪实现方法

    Spring Cloud 专题之Sleuth 服务跟踪实现方法

    这篇文章主要介绍了Spring Cloud 专题之Sleuth 服务跟踪,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Maven如何修改打包文件名称

    Maven如何修改打包文件名称

    这篇文章主要介绍了Maven如何修改打包文件名称问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java8 stream 由一个list转化成另一个list案例

    java8 stream 由一个list转化成另一个list案例

    这篇文章主要介绍了java8 stream 由一个list转化成另一个list案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java排序算法之SleepSort排序示例

    Java排序算法之SleepSort排序示例

    这篇文章主要介绍了Java排序算法之SleepSort排序,结合实例形式分析了SleepSort排序的实现步骤与相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • Java 中的垃圾回收机制详解

    Java 中的垃圾回收机制详解

    这篇文章主要为大家详细介绍了Java垃圾回收机制的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java Socket实现聊天室功能

    Java Socket实现聊天室功能

    这篇文章主要为大家详细介绍了Java Socket实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • httpclient的CPool定义方法详解

    httpclient的CPool定义方法详解

    这篇文章主要为大家介绍了httpclient的CPool定义方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 关于springboot打包目录全解析

    关于springboot打包目录全解析

    这篇文章主要介绍了springboot打包目录解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Boot 整合 Druid过程解析

    Spring Boot 整合 Druid过程解析

    这篇文章主要介绍了Spring Boot 整合 Druid过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论