栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;


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;


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) {
    }
  }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/134135.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号