【Java并发编程十】同步控制二

2023-11-22 08:20

本文主要是介绍【Java并发编程十】同步控制二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Semaphore 信号量

 Semaphore可以减少负载,使限制同时运行的线程数量。Semaphore的执行过程是先获取一定数量的线程,执行完一个释放一个semaphore,再去执行一个新的线程。

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class myTest implements Runnable{// semaphore表示信号量final Semaphore semaphore = new Semaphore(5);public static void main(String[] args) {// 线程池ExecutorService executorService = Executors.newFixedThreadPool(20);final myTest test = new myTest();for(int i=0; i<20; i++) {executorService.submit(test);}}@Overridepublic void run() {try {long startTime = System.currentTimeMillis();// semaphore数量超过限制的数量,自身便会阻塞semaphore.acquire();Thread.sleep(2000);semaphore.release();long endTime = System.currentTimeMillis();System.out.println(Thread.currentThread().getId()+" cost " + (endTime-startTime) + " ms");} catch (InterruptedException e) {throw new RuntimeException(e);}}
}/**
由于设置semaphore最大数量为5,所以同一时刻最多有五个线程同时运行。
25 cost 2010 ms
27 cost 2010 ms
26 cost 2010 ms
24 cost 2010 ms
28 cost 2010 ms
33 cost 4010 ms
30 cost 4010 ms
29 cost 4019 ms
31 cost 4018 ms
32 cost 4018 ms
38 cost 6012 ms
35 cost 6012 ms
37 cost 6019 ms
43 cost 6019 ms
36 cost 6028 ms
*/

CountDownLatch 倒计时器

 CountDowmLatch是每次等到一定数量,end.await() 才会放行。

package myTest;import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class myTest implements Runnable{static final CountDownLatch end = new CountDownLatch(10);static final myTest test = new myTest();public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(10);for(int i=0; i<20; i++) {executorService.submit(test);}// 等待所有线程就绪end.await();System.out.println("开始");executorService.shutdown();}@Overridepublic void run() {try {long startTime = System.currentTimeMillis();Thread.sleep(new Random().nextInt(10)*100);long endTime = System.currentTimeMillis();System.out.println("共执行 "+ (endTime-startTime) + " ms");end.countDown();} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

CyclicBarrier 循环栅栏

 CyclicBarrier可以重复被利用,而CountDownLatch不行。
 CyclicBarrier正如它的名字一样,循环栅栏,栅栏是一个阻挡别人进入的障碍物,CyclicBarrier和CountDownLatch一样有一个计数器,不过CountDownLatch的计数器被定义了之后就只能被一直减少,最后减少到0时,完全结束,而CyclicBarrier的计数器则是从0开始增加,直到指定数值时开始放行,然后计数器归零,并等待下一波线程的访问

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class myTest implements Runnable{static final CyclicBarrier end = new CyclicBarrier(5);static final myTest test = new myTest();public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(20);for(int i=0; i<20; i++) {executorService.submit(test);}executorService.shutdown();}@Overridepublic void run() {try {long startTime = System.currentTimeMillis();Thread.sleep(new Random().nextInt(10)*100);end.await();System.out.println(Thread.currentThread().getId()+"集合完成");end.await();long endTime = System.currentTimeMillis();System.out.println(Thread.currentThread().getId() + " 执行完毕: "+ endTime + " ms");} catch (InterruptedException e) {throw new RuntimeException(e);} catch (BrokenBarrierException e) {throw new RuntimeException(e);}}
}

这篇关于【Java并发编程十】同步控制二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/408774

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python