JavaEE 第15节 JUC相关组件介绍

2024-08-22 16:28
文章标签 java 组件 15 介绍 相关 ee juc

本文主要是介绍JavaEE 第15节 JUC相关组件介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言:

Callable 

ReentrantLock

Semaphore

CountDownLatch


前言:

在Java中,JUC(包路径:java.util.concurrent)是一个用于并发编程的包,提供了线程安全的集合类、同步工具、并发执行框架和原子变量等,以简化和增强多线程编程的性能和可靠性。接下来介绍的这几个组件使用起来都比较简单。


Callable 

Callable是一个接口,你可以理解成它是一个带有返回值的Runnable。

如图,Runnable和Callable的创建对比:

Thread类没有关于Callable的构造方法。原因在于需要通过Callable的实例创建FutureTask的实例才行:

public class CallableTest {public static void main(String[] args) throws InterruptedException, ExecutionException {Callable<Integer> callable=new Callable<Integer>() {@Overridepublic Integer call() throws Exception {System.out.println("hehhe");return 10;}};/**在创建线程的时候,多出了创建FutureTask的对象这一步*/FutureTask<Integer> futureTask=new FutureTask<>(callable);Thread thread=new Thread(futureTask);thread.start();thread.join();/*get方法可以获取到返回值*/int ret=futureTask.get();System.out.println("thread:"+ret);}
}

FutureTask是一个类,它的get方法可以获取call方法的返回值。

执行结果:

hehhe
thread:10


ReentrantLock

除了synchronized,Java标准库开提供了其他方式对线程进行加锁的操作。

比如:Excuters(第10节线程池讲过)、Semaphore(等一下会讲)、ReentrantLock(当前正题)等。

ReentrantLock是一个类(需要创建对象使用),与synchronized对比,ReentrantLock的区别:

  • 加锁方式:需要用到lock()/unlock()来上锁解锁,因此为了避免死锁,最好把unlock()放到finally块中。
  • tryLock:ReentrantLock提供了tryLock(),调用此方法,如果加锁失败,当前线程不会进入阻塞状态,而是直接返回,执行别的任务。
  • 公平锁:ReentrantLock默认是不公平锁,不过可以在使用构造方法的时候设置成公平锁。
  • 更精确的通知:ReentrantLock实现了Condition接口,在这个接口中,提供了一组方法,可以精确的唤醒某个满足特定条件的线程。而synchronized只能随机或全部唤醒。

Semaphore

Semaphore是计算机的一个专业术语,意为“信号量”。

它是一个控制资源访问的同步类工具。它可以限制同时访问某一个特定资源的总线程数量,保证多个线程可以有序的访问共享资源。

举个形象的例子:

在停车场的入口,我们通常会看到这个显示剩余车位的指示牌:

Semaphore就可以类比成这个指示牌。用了这个指示牌,外面的车子就不会无脑的开进去,在车位满了的时候就不会出现拥堵。

Semaphore的使用方式:

public class SemaphoreTest {public static void main(String[] args) {Semaphore semaphore=new Semaphore(4);for (int i = 0; i <20 ; i++) {int id=i;Thread t=new Thread(()->{try {System.out.println("申请资源");semaphore.acquire();//申请资源的方法System.out.println("执行任务:"+id);System.out.println("释放资源");semaphore.release();//释放资源的方法} catch (InterruptedException e) {e.printStackTrace();}});t.start();}}
}

如果Semaphore构造方法的参数设置成1,那么它就变成了一个加锁操作,一个线程在完成了任务后,其他线程才可以继续执行。

CountDownLatch

CountDownLatch是JUC中的一个同步辅助类,用它的构造方法可以设置一个任务数量,每次执行完一个任务,可以调用它自带的contDown()方法任务计数器会-1。当任务计数器为0的时候,可以唤醒其他线程(调用了CountDownLatch类的'await()'方法的线程,这个方法可以让调用它的线程进入睡眠直到任务计数器减为0)。

代码演示:

public class JUCcountDown {public static void main(String[] args) throws InterruptedException {ExecutorService service= Executors.newFixedThreadPool(4);CountDownLatch latch=new CountDownLatch(20);for (int i = 0; i <20 ; i++) {int id=i;service.submit(()->{System.out.println("执行任务:"+id);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("任务:"+id+"执行完毕");latch.countDown();//计数器-1});}//主线程进入睡眠,计数器为0才会苏醒latch.await();System.out.println("所有任务执行完毕!");}
}

这篇关于JavaEE 第15节 JUC相关组件介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去