java中的线程通讯和线程池,Callable任务

线程通讯:
在多线程中,某个线程进入“等待状态”时,需要某个线程来唤醒

等待方法:
wait()//无线等待

wait(long 毫秒)//计时等待

注意,调用wait方法,会自动释放掉锁资源

处于wait状态只能由其他线程唤醒

唤醒方法:
notify();//唤醒处于“等待状态”的任意一个线程,和notify使用相同锁对象的线程

notifyAll();//唤醒处于“等待状态”的所有线程

注意,调用notify(),notifyAll()方法,不会自动释放掉锁资源

使用细节:

等待和唤醒的方法,都要使用锁对象调用需要在同步代码块中使用

等待和唤醒方法都应该使用相同的锁对象调用

消费者,生产者模型:

//共享资源
public class Resource {static public int number=0;
}
public class test2 {public static void main(String[] args) {Object lock=new Object();//创建消费者线程new Thread(new Runnable() {@Overridepublic void run() {while (true) {synchronized (lock) {if (Resource.number >= 3) {System.out.println("这有足够多的食物");try {lock.wait();//阻塞并释放锁} catch (InterruptedException e) {throw new RuntimeException(e);}} else {Resource.number++;//,一开时number=0,先++再打印System.out.println("[p]:" + Resource.number);lock.notify();//唤醒处于等待状态的线程,且不会释放锁try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}}}).start();Runnable task=new Runnable() {@Overridepublic void run() {while (true) {synchronized (lock) {if(Resource.number==0){System.out.println("这没有足够的资源");try {lock.wait();//阻塞的同时会释放掉锁} catch (InterruptedException e) {throw new RuntimeException(e);}}else {System.out.println("[c]"+Resource.number);//先打印,再--Resource.number--;lock.notify();//唤醒生产者线程,生产者如果没有处于等待,就没事//只能唤醒别的线程try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}}};new Thread(task).start();}}

线程池:
如何获得线程池对象:


方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象 

计算密集型任务:核心线程数:cpu数+1

IO密集型任务:核心线程数:cpu数*2

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

参数一:  corePoolSize:指定线程池的核心线程的数量

参数二:maximumPoolSize:指定线程池的最大线程数量

参数三: long keepAliveTime:指定临时线程的存活时间(没有事情干)

参数四:unit:指定临时线程的存活时间单位(分,秒,天)

参数五:workQueue:指定线程池的任务队列

参数六:threadFactory:指定线程池的线程工厂

参数七: handler:指定线程池的任务拒接策略

例如:

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 8, TimeUnit.MINUTES,new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),//  // Executors.defaultThreadFactory()获取默认的线程池工厂new ThreadPoolExecutor.AbortPolicy());

临时线程什么时候创建:

新任务提交时发现核心线程都在忙,任务对列也满了,并且还可以创建临时线程

什么时候拒绝新任务:
核心线程和临时线程都满了,任务队列也满了 

一个任务类:

public class Task1 implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"输出yyyy");try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}
}
public class test {public static void main(String[] args) {//创建一个线程池对象ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 8, TimeUnit.MINUTES,new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(),//  // Executors.defaultThreadFactory()获取默认的线程池工厂new ThreadPoolExecutor.AbortPolicy());//添加任务threadPoolExecutor.execute(new Task1());//线程池会自动创建一个线程,自动处理任务threadPoolExecutor.shutdown();//等待线程池所有任务执行完后关闭线程池threadPoolExecutor.shutdownNow();//立即关闭线程池}
}

方式二:使用Executors工具类

public static ExecutorService newFixedThreadPool(int nThreads)

创建固定线程数量的线程池,如果某个线程因为异常关闭,那么线程池会创建出一个新的线程

public static ExecutorService newSingleThreadExecutor()

创建只有一个线程的线程池, 如果这个线程因为异常关闭,那么线程池会创建出一个新的线程

Callable任务:

 Interface Callable<V>

Callable支持结果返回,Runnable不行

Callable可以抛出异常,Runnable不行

Callable任务处理使用步骤:
1:创建线程池

2:定义Callable任务

3:创建Callable任务,提交任务给线程池

4:获取执行结果

public class test2 {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建线程池对象ExecutorService executorService = Executors.newFixedThreadPool(10);//创建一个Callable类型的任务类Callable<Integer>callable=new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum=0;for(int i=0;i<10;i++){sum+=i;}return sum;}};//交给线程池处理(submit()方法),并获取返回值Future<Integer> submit = executorService.submit(callable);System.out.println(submit.get());//通过get方法获取返回值}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在宽松许可证下构建有竞争力的Milvus Cloud商业服务?

如何在宽松许可证下构建有竞争力的商业服务? 开源公司并不一定要修改许可证作为唯一的出路,不过其挑战在于找到开源与商业化之间的平衡。 以 Zilliz 为例,我们选择将开源向量数据库 Milvus 捐赠给 Linux 基金会。在过去四年的时间里,Milvus 已经在 GitHub 上获得了超过 …

uni-app的页面中使用uni-map-common的地址解析(地址转坐标)功能,一直报请求云函数出错

想在uni-app的页面中使用uni-map-common的地址解析&#xff08;地址转坐标&#xff09;功能&#xff0c;怎么一直报请求云函数出错。 不看控制台啊,弄错了控制台&#xff0c;就说怎么一直没有打印出消息。 所以开始换高德地图的&#xff0c;昨天申请了两个 一开始用的第二个web…

大话设计模式之桥接模式

桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过提供一个桥接接口来实现这种分离&#xff0c;使得抽象部分和实现部分可以在运行时独立地进行修改。 桥接模式主要由两个部分组成&#xff1a;抽象部分…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

麦多馅饼开店流程及费用明细?

麦多馅饼作为一种深受人们喜爱的美食&#xff0c;在市场上拥有广泛的消费群体。近年来&#xff0c;越来越多的创业者将目光投向了麦多馅饼这一领域&#xff0c;希望通过加盟或自主经营的方式开设一家麦多馅饼店。本文将详细介绍麦多馅饼的开店流程以及相关的费用明细&#xff0…

单细胞RNA测序(scRNA-seq)cellranger count的细胞定量和aggr整合

单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分 单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 细胞定量…

数据库(mysql)-连接嵌套查询-2

子查询 MySQL中的子查询&#xff08;Subquery&#xff09;是嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM或WHERE子句中&#xff0c;并用于返回将被用于外部查询的数据。子查询的结果可以是一个单一的值、一行、一列或多行多列的数据集。 单行单列查询 实例 #查…

弱口令入侵FE企业管理平台【附口令】

漏洞描述 飞企互联-FE企业运营管理平台 druid路径弱口令&#xff0c;攻击者可能通过尝试弱口令&#xff0c;非法进入系统&#xff0c;恶意操作或者收集信息进一步攻击利用。 漏洞复现 1、Fofa app"飞企互联-FE企业运营管理平台"2、零零信安 (html_banner360浏览…

基于ssm作业提交与查收系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本作业提交与查收系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

1.Spring的核心思想 —— IOC和DI

1. Spring是什么&#xff1f; 简单的说&#xff0c;Spring其实指的是Spring Framework&#xff08;Spring框架&#xff09;&#xff0c;是一个开源框架。 如果要用一句话概括&#xff1a;它是包含众多工具方法的IOC&#xff08;Inverse of Control控制反转&#xff09;容器。…

字节码文件的组成

字节码文件的组成 字节码文件的组成1 以正确的姿势打开文件2 字节码文件的组成2.1 基本信息2.2 常量池2.3 字段2.4 方法2.5 属性 3 字节码常用工具3.1 javap3.2 jclasslib插件3.3 Arthas 4 字节码常见指令 字节码文件的组成 1 以正确的姿势打开文件 字节码文件中保存了源代码…

RPA实战演练UiBot6.0新食堂一楼问卷星(类似于之前的网页表单提交)

要使用RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;帮助新食堂进行调查问卷&#xff0c;我们可以结合UiBot 6.0来实施具体的计划。以下是一个大致的实战演练计划&#xff1a; 一、目标与需求分析 明确调查目标&#xff1a;了解新食堂…