Java多线程复习与巩固
文章平均质量分 96
大学快毕业了,要找工作了,还是要好好巩固以前学过的知识啊。多线程、高并发就是重中之重。
Holmofy
奋斗中的小菜鸟
展开
-
ThreadPoolExecutor最佳实践--如何选择队列
前一篇文章《如何选择线程数》讲了如何决定线程池中线程个数,这篇文章讨论“如何选择工作队列”。再次强调一下,ThreadPoolExecutor最核心的四点:1、当有任务提交的时候,会创建核心线程去执行任务(即使有核心线程空闲);2、当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;3、当BlockingQueue满了(offer失败),就...原创 2018-08-12 20:55:45 · 5929 阅读 · 0 评论 -
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。总结一下,主要有以下四点:当有任务提交的时候,会创建核心线程去执行任务;当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;当BlockingQueue满了(offer失败),就回创建临时线程;当线程总数达到maximumPoo...原创 2018-07-29 15:47:05 · 16031 阅读 · 4 评论 -
Java多线程复习与巩固(一)--线程基本使用
进程与线程在并发编程中,有两个基本的执行单元:进程和线程。在Java中,并发编程主要关心的是线程。当然,进程也很重要。进程(Process)进程有独立的执行环境,一个进程有一套私有的、完整的运行时资源,比如:每个进程都有自己的内存空间。进程通常会被认为是一个应用程序的代名词。但实际上一个应用程序可能会包含多个协同工作的进程。比如你电脑里的360打开后肯定有两个或两个以上的进程:...原创 2017-06-14 15:27:20 · 976 阅读 · 0 评论 -
Java多线程复习与巩固(二)--线程相关工具类Timer和ThreadLocal的使用
定时器(Timer类)如果我们需要让某个任务在另一个线程中周期性的执行,或者让它在某个时刻执行一次。这时我们可能会写这样的代码:周期任务:// 周期任务public class PeriodTask implements Runnable{ private long period = 1000; private boolean running = true; ...原创 2017-06-14 21:21:43 · 865 阅读 · 0 评论 -
Java多线程复习与巩固(三)--线程同步
多线程容易出现的问题因为一个进程内,多个线程线程共享该进程的资源,而进程之间,资源的获取是互斥的,所以线程间通信比进程间通信更简单。我们可以直接通过共享资源的访问来实现线程间通信,这种通信方式十分有效(速度快),但也容易产生错误,如:线程干扰和内存一致性错误。看一下下面这个例子:这个程序有两个线程,一个线程对计数器进行10000次加一操作,一个线程对计数器进行10000次减一操作,两个线程...原创 2017-06-14 23:56:11 · 1038 阅读 · 3 评论 -
Java多线程复习与巩固(四)--synchronized的实现
小小的回顾在上一篇文章的例子中有一个Counter类:static class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; }}为了实现线程同...原创 2017-06-15 20:46:36 · 960 阅读 · 0 评论 -
Java多线程复习与巩固(五)--生产者消费者问题(第一部分)
生产者消费者问题(第一部分)生产者消费者问题也称为有限缓冲问题,是线程同步的一个经典问题:生产者线程和消费者线程共享一块固定大小的缓存,生产者负责生成产品然后存入共享缓冲区中,消费者负责从共享缓冲区中取出产品进行消费。该问题的关键在于生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。要解决这个问题就必须:让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产...原创 2017-08-01 19:56:18 · 903 阅读 · 0 评论 -
Java多线程复习与巩固(六)--线程池ThreadPoolExecutor详解
1. 为什么要使用线程池线程创建与销毁都耗费时间,对于大量的短暂任务如果仍使用“创建->执行任务->销毁”的简单模式,将极大地降低线程的使用效率(一个线程仅仅处理一个短暂的任务就被销毁了)。在这种情况下,为了提高线程的使用效率,我们使用缓存池的策略让线程执行任务后不立即销毁而是等待着处理下一个任务。2. 使用Executors工具类创建线程池Executors是线程池框原创 2017-08-19 14:16:38 · 5032 阅读 · 3 评论 -
Java多线程复习与巩固(七)--任务调度线程池ScheduledThreadPoolExecutor
强烈建议看本文之前,先把《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》看完。首先因为ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,不了解ThreadPoolExecutor的原理看本文可能会有些吃力;另外本文的行文思路会按照《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》的顺序进...原创 2018-02-22 00:07:34 · 1505 阅读 · 0 评论 -
Java多线程复习与巩固(八)--原子性操作与原子变量
前面讲线程同步时,我们对多线程出现的问题进行了分析,在那个例子中,问题的根源在于c++和c--这两个操作在底层处理的时候被分成了若干步执行。当时我们用的是synchronized关键字来解决这个问题,而从synchronize的实现原理中我们知道synchronized通过monitor监视器来实现线程同步,这种同步方式要求线程等待monitor的拥有者线程释放后,才可能进一步执行,而线程等待可能...原创 2017-06-26 18:13:13 · 718 阅读 · 0 评论 -
Java多线程复习与巩固(九)--volatile关键字与CAS操作
前一篇文章中提到原子操作,也许大家和我一样很好奇为什么AtomicInteger.increment方法能保证原子性,而简单的++运算却不能保证原子性。这篇文章我们就从AtomicInteger类下手分析源码,来了解一下原子操作的实现原理,但是分析源码之前需要来一段小小的前奏。CPU内存架构现代计算机都是多处理机CPU,每个核心(Core)都有一套寄存器,CPU访问寄存器的速度是最快的...原创 2017-06-27 23:16:48 · 5114 阅读 · 0 评论