服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java详解多线程协作作业之信号同步

Java详解多线程协作作业之信号同步

2022-12-09 13:58好奇的菜鸟 Java教程

信号量同步是指在不同线程之间,通过传递同步信号量来协调线程执行的先后次序。CountDownLatch是基于时间维度的Semaphore则是基于信号维度的

一、信号同步

多线程很多时候是协作作业。比如4个线程对电商数据分季度统计,统计完成之后,再汇总。如何知道4个线程都执行完成呢,我们可以使用JDK1.5给我们提供的辅助类CountDownLatch(

减少计数)、CyclicBarrier(循环栅栏)、Semaphore(信号灯)。

 

二、基于时间维度

1、CountDownLatch

多少个协作线程就初始化CountDownLatch的构造参数是多少。

 public static void main(String[] args) throws InterruptedException {
      final int NUM=6;
      //定义总数量;
      CountDownLatch countDownLatch=new CountDownLatch(NUM);
      for (int i = 0; i < NUM; i++) {
          new Thread(()->{
              System.out.println(Thread.currentThread().getName()+"线程,已执行!");
              //减少计数
              countDownLatch.countDown();
          },String.valueOf(i+1)).start();
      }
      //等待所有任务完成
      countDownLatch.await();
      System.out.println("所有线程任务已经执行完成!");
  }

Java详解多线程协作作业之信号同步

2、CyclicBarrier

与减少计数类似

 public static void main(String[] args) {
      final int NUM = 6;
      //定义循环数量及循环完成后的任务(Runnable接口实现);
      CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> {
          System.out.println("所有线程任务已经执行完成!");
      });
      for (int i = 0; i < NUM; i++) {
          new Thread(()->{
              System.out.println(Thread.currentThread().getName()+"线程,已执行!");
              try {
                  //等待点或障碍点,等待所有任务完成,
                  cyclicBarrier.await();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } catch (BrokenBarrierException e) {
                  e.printStackTrace();
              }
          },String.valueOf(i+1)).start();
      }
  }

Java详解多线程协作作业之信号同步

 

三、基于信号维度

Semaphore,线程与信号是m:n,其中m>=n。

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/*信号灯
* 6个线程,抢占三个信号
* */
public class SemaphoreDemo {
  public static void main(String[] args) {
      Semaphore semaphore=new Semaphore(3);
      for (int i = 0; i < 6; i++) {
          new Thread(()->{
              try {
                  //获取信号
                  semaphore.acquire();
                  System.out.println("线程:"+Thread.currentThread().getName()+"----获取信号");
                  int time = new Random().nextInt(5);
                  System.out.println(("线程:"+Thread.currentThread().getName()+"----休眠"+time+"s!"));
                  TimeUnit.SECONDS.sleep(time);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }finally {
              //    释放信号
                  System.out.println("线程:"+Thread.currentThread().getName()+"---释放信号");
                  semaphore.release();
              }
          },String.valueOf(i+1)).start();
      }
  }
}

首先线程4、1、3获取到信号,线程1释放信号后,线程2获得信号。线程2、3释放信号后,线程5、6获得信号。

Java详解多线程协作作业之信号同步

到此这篇关于Java详解多线程协作作业之信号同步的文章就介绍到这了,更多相关Java信号同步内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_29752857/article/details/124663969

延伸 · 阅读

精彩推荐