多线程
文章平均质量分 73
wen-pan
是程序猿一只呀
展开
-
手写一个线程池
实现了基本的线程池功能,比如提交不需要返回结果的任务提交需要返回值的任务自定义线程池各个参数线程池中的worker执行完任务后自动去队列里获取一个任务来执行自定义拒绝策略需要优化的功能更精细的并发控制根据线程池中worker的具体情况来判断是否要销毁当前worker当然,最正宗的还是要看 大哥李 开发的线程池①、自定义线程池public class MyThreadPool { /** * 线程池状态(默认0,正在运行,1线程池关闭中,2线程池终结)原创 2022-03-13 16:26:51 · 868 阅读 · 0 评论 -
ThreadPoolExecutor线程池execute和submit的区别
结论基本没有区别,在submit方法中仍然是调用的execute方法进行任务的执行或进入等待队列或拒绝。submit方法比execute方法多的只是将提交的任务(不管是runnable类型还是callable类型)包装成RunnableFuture然后传递给execute方法执行。源码对比①、execute源码public void execute(Runnable command) { if (command == null) throw new NullPoin.原创 2021-08-30 10:12:01 · 9846 阅读 · 0 评论 -
调用ThreadPoolTaskExecutor的shutdown方法一定会让正在执行的线程任务执行完毕吗
先给答案不一定,要想在调用ThreadPoolTaskExecutor.shutdown方法的时候让线程池等待正在执行的任务执行完毕后再关闭,需要手动设置waitForTasksToCompleteOnShutdown属性值为true。这里讨论的是在基于JVM不关闭的情况下调用ThreadPoolTaskExecutor.shutdown方法,如果JVM正在关闭的情况分析可参考:线程池shutdown和shutdownNow原理和区别JVM关闭的时候到底会不会等待线程池线程任务执行完毕注意原创 2021-08-28 12:08:32 · 8228 阅读 · 0 评论 -
线程池shutdown和shutdownNow原理和区别
说明:以ThreadPoolExecutor线程池为例说明整个流程(不同的线程池实现上略有差别)。一、shutdown流程1、流程简介修改线程池状态为SHUTDOWN再接收新提交的任务中断线程池中空闲的线程第③步只是中断了空闲的线程,但正在执行的任务以及线程池任务队列中的任务会继续执行完毕二、shutdownNow流程1、流程简介修改线程池状态为SHUTDOWN不再接收任务提交尝试中断线程池中所有的线程(包括正在执行的线程)返回正在等待执行的任务列表 List<Run原创 2021-08-27 15:24:48 · 4767 阅读 · 0 评论 -
JVM关闭的时候到底会不会等待线程池线程任务执行完毕
线程池的shutdown()方法和shutdownNow()方法起到的作用只是将每个线程内部的中断状态变为true,表示该线程收到过中断信号。并不能实际的停止线程,也就是说只能够起到一个通知的作用!其实这个问题的答案很容易知道,反向想一想,如果JVM关闭的时候如果真的需要等待每一个正在执行任务的线程执行完毕才完全关闭,那么如果有的任务执行非常耗时(或者直接就是死循环),那岂不是JVM永远不能退出了。这里主要是探究在JVM关闭过程中的动作,以及如果关闭过程中存在一直运行的任务会如何处理。shutdo..原创 2021-08-27 21:03:46 · 4134 阅读 · 1 评论 -
ReentrantLock可重入锁原理
可重入锁原理上篇 介绍了可重入锁的加锁解锁原理和源码,这里记录一下ReentrantLock是如何实现可重入锁的。①、可重入示例锁代码展示在main方法中调用了m1方法,m1方法执行时需要获取lock,并且m1方法中又调用了m2方法,m2方法执行仍然需要获取锁。@Slf4jpublic class ReentrantTest { private final ReentrantLock lock = new ReentrantLock(); public stat原创 2021-06-13 18:50:20 · 459 阅读 · 0 评论 -
ReentrantLock原理源码详解
I)、AQS介绍要理解ReentrantLock,首先必须要理清楚AQS以及AQS是什么,有哪些重要属性,以及整个ReentrantLock的继承关系结构是什么样的。这部分对于第一次接触AQS来说却是有点绕。1、什么是AQS个人简单理解AQS,AQS(AbstractQueuedSynchronize)按照他的字面意思:1、Abstract抽象的,说明该类是一个抽象类,具体一些如何控制同步策略需要子类去实现。2、Queued队列,说明该同步器需要用一个队列来存放竞争锁失败的线程,以便于锁被释放原创 2021-06-13 18:46:29 · 372 阅读 · 0 评论 -
synchronized能不能禁止指令重排序
I)、指令重排序1、问题描述首先一定要明确:指令重排序和有序性是不一样的。这一点非常重要。我们经常都会这么说:①、volatile能保证内存可见性、禁止指令重排序但是不能保证原子性。②、synchronized能保证原子性、可见性和有序性。**注意:**但是这里的有序性并不是代表能禁止指令重排序。举个例子:在双重检查的单例模式中,既然已经加了synchronized为什么还需要volatile去修饰变量呢?如果synchronized能禁止指令重排,那么完全可以不用要volatile。原创 2021-06-09 17:43:20 · 3027 阅读 · 11 评论 -
java多线程之自定义消息队列
说明这里将自己定义实现一个消息队列,该消息队列可以手动配置队列容量,可以供生产者生产消息,可以供消费者消费消息。1、自定义消息队列消息类@Datapublic class Message { // 消息ID private final int id; // 消息内容 private final Object message; public Message(final int id, final Object message) { thi原创 2021-06-09 11:29:38 · 793 阅读 · 0 评论 -
哲学家就餐死锁问题及解决方案
1、哲学家用餐问题描述可参考百度!哲学家用餐问题有五位哲学家,围坐在圆桌旁。他们只做两件事,思考和吃饭,思考一会吃口饭,吃完饭后接着思考。吃饭时要用两根筷子吃,桌上共有 5 根筷子,每位哲学家左右手边各有一根筷子。如果筷子被身边的人拿着,自己就得等待2、代码模拟哲学家问题产生死锁的情况筷子类@Datapublic class Chopstick { /** * 筷子名称 */ String name; public Chopstick(final原创 2021-06-09 11:17:55 · 1364 阅读 · 0 评论 -
Java多线程虚假唤醒问题
1、API解释obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒问题:为什么 if会出现虚假唤醒?因为if只会执行一次,执行完会接着向下执行if()外边的而while不会,直到条件满足才会向下执行while()外边的2、虚假唤醒①、成员介绍有三个角色:一个是外卖员,一个原创 2021-06-08 09:53:19 · 292 阅读 · 1 评论