【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

相关文章

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException