JCIP-32-线程池的使用
线程池调优的必要性
在标准的Executor实现中,当执行需求较低时将回收空闲线程,而当需求增加时将添加新的线程,并且如果从任务中抛出了未检查异常,那么将用一个新的工作者线程替代抛出异常的线程。
只有当线程本地值的生命周期受限于任务的生命周期时,在线程池中的线程使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThreadLocal在任务之间传递值。
只有当任务都是同类型...
2019-01-18 03:21:15 |
Concurrency
JCIP-30-任务的关闭与取消
java 对于终止线程的考虑
Java没有提供任何机制来安全地(抢占式方法)终止线程,
虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。
但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。
一、取消
取消操作的原因
用户请求取消
...
2019-01-18 03:21:15 |
Concurrency
JCIP-29-Executor 框架小结
jdk8 以后的多线程处理
集合进行并行计算有两种方式:并行流和CompletableFutures。
并行流
计算密集型操作,并且没有I/O,推荐使用Stream接口。因为实现简单,同时效率也可能是最高的(如果所有的线程都是计算密集型的,那就没有必要创建比处理器核数更多的线程);
CompletableFutures
如果并行的工作单元还涉及等待I/O的操作(包括网络连接等待),...
2019-01-18 03:21:15 |
Concurrency
JCIP-28-Executor CompletableFuture
Future 的不足
性能
虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。
阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢?
多个 Future 结果之间的依赖性
Future接...
2019-01-18 03:21:15 |
Concurrency
JCIP-27-Executor CompletionService ExecutorCompletionService
CompletionService
接口
定义了一系列的方法的接口。
public interface CompletionService<V> {
Future<V> submit(Callable<V> task);
Future<V> submit(Runnable task, V result);
...
2019-01-18 03:21:15 |
Concurrency
JCIP-26-Executor Future FutureTask
Future
在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。
Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。
Future模式可以这样来描述:我有一个任务,提交给了Future,...
2019-01-18 03:21:15 |
Concurrency
JCIP-25-Executor ScheduledThreadPoolExecutor 实现定时调度
Timer 类的不足
为什么需要 ScheduledThreadPoolExecutor?
在JDK1.5之前,我们关于定时/周期操作都是通过Timer来实现的。
但是Timer有以下几种危险
a. Timer是基于绝对时间的。容易受系统时钟的影响。
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响
c. Timer不会捕获...
2019-01-18 03:21:15 |
Concurrency
JCIP-24-Timer 实现定时调度
Timer
如果我们想定时执行一个任务,应该怎么做呢?
Timer 就是一个 Java 提供的类。
入门例子
测试代码
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTes...
2019-01-18 03:21:15 |
Concurrency