Java线程池Executor

线程池的好处

1,降低资源消耗。线程的生命周期开销很高,通过重复利用已创建的线程可以节省线程创建和销毁的资源消耗。
2,提高响应速度。
3,提高线程的可管理性。比如设置线程的创建上限。线程池可以对线程进行统一分配、调优和监控。
Java线程池主要继承于Executor类,包括ThreadPoolExecutor和ScheduledThreadPoolExecutor。可以用工厂类Executors来创建线程池对象。
ThreadPoolExecutor子类型的包括:单个线程线程池、固定数目线程池、缓存线程池。这三种其实是调节创建ThreadPoolExecutor对象时的参数来实现的。所以我们看下参数
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize:核心线程池的大小
maximumPoolSize:最大线程池大小
BlockingQueue:线程工作队列
RejectedExecutionHandler:线程池关系或饱和时,execute()将调用handler
keepAliveTime:线程保持时间
TimeUnit:保持时间的单位
threadFactory:创建线程方法
通过Executor的工具类Executors创建的常用的三个线程池:
1、固定数目线程池
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
固定线程池的corePoolSize、maximumPoolSize就是所给定的固定值。keepAliveTime为多余空余线程等待时间,如果超过这个时间,则多余的线程会停止。但实际如果运行中的线程已经等于corePoolSize,则空闲线程会进入LinkedBlockingQueue,而此队列大小默认为int最大值,所以不会有空闲线程被停止,也就是keepAliveTime和unit参数其实无效
2、单个线程线程池
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
threadFactory));
}
单worker线程池的corePoolSize和maximumPoolSize都是1,保证任何时候最多只有一个线程运行。
3、缓存线程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
缓存线程corePoolSize为0,maximumPoolSize为最大值,保证在机器资源足够的情况下,任何线程都会立刻执行。而使用了的SynchronousQueue是一个没有容量限制的工作队列。

ThreadPoolExecutor的void execute(Runnable command);方法处理Runnable类型的任务,Future<?> submit(Runnable task)或 Future submit(Callable task)方法处理可以获取返回值的任务。通过Future的get()方法获取返回值。如果task要获取返回值,要使用带有返回值的类,比如Callable方法。
如果只想使用一个有返回值的线程,可以用FutureTask,它继承于Runnable和Future,所以可以单独执行线程,也可以获取返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值