java线程池

为什么用使用线程池

1.降低资源消耗:很多线程执行的时间很短,如果每次需要执行线程都去创建和销毁线程,会产生很多不必要的开销。

2.提高线程的可管理性

Executors类

大致结构:在Executors类中,定义了几个静态内部类,如:

DelegatedExecutorService FinalizableDelegatedExecutorService DelegatedScheduledExecutorService

工作中经常会用到Executors类去new一个线程池,一共有12个方法,分为5种线程池:

public static ExecutorService newFixedThreadPool(int nThreads) {
// 固定大小线程池
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
/* 处理大量短时间工作任务的线程池
(1)试图缓存线程并重用,当无缓存线程可用时,会创建新的工作线程
(2)如果线程闲置的时间超过阈值,则会被终止并移出缓存
(3)系统长时间闲置的时候,不会消耗什么资源
*/
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
// 创建唯一的工作者线程来执行任务,如果线程异常结束,会有另一个线程取代它
    return new DelegatedScheduledExecutorService
        (new ScheduledThreadPoolExecutor(1));
}
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
// 定时或周期性的工作调度,多个线程
    return new ScheduledThreadPoolExecutor(corePoolSize);
}public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
// 定时或周期性的工作调度,单个线程
    return new DelegatedScheduledExecutorService
        (new ScheduledThreadPoolExecutor(1));
}
public static ExecutorService newWorkStealingPool() {
// 内部会构建ForkJoinPool,利用work-stealing算法,并行处理任务,不保证处理顺序
    return new ForkJoinPool
        (Runtime.getRuntime().availableProcessors(),
         ForkJoinPool.defaultForkJoinWorkerThreadFactory,
         null, true);
}

newSingleThreadScheduledExecutor和newScheduledThreadPool再加上另外4个,每个方法都有参数重载(ThreadFactory,java只有参数类型和个数重载,不能以返回值重载),所以总共是12个创建线程池的静态方法。

Fork/Join框架

把大任务分割为若干个小任务并行执行,最终汇总每个小任务结果得到大任务结果的框架。更大的利用多处理器带来的好处,利用所有可用的运算能力来提升性能,类同于mapReduce原理。

ForkJoin会将任务分发给线程池中的工作线程,使用work-stealing算法(简单来说:某个线程从其他队列里窃取任务来执行)

ForJoinPool最适合计算密集型任务

ThreadPoolExecutor参数

int corePoolSize:核心线程数 当池中正在运行的线程数(包括空闲线程)小于corePoolSize时,新建线程执行任务
int maximumPoolSize:最大线程数 队列里的任务数达到上限,并且池中正在运行的线程数小于maximumPoolSize对于新加入的任务,新建线程
long keepAliveTime:空闲线程存活时间
TimeUnit unit:时间单位
BlockingQueue<Runnable> workQueue:阻塞队列 当池中正在运行的线程数大于等于corePoolSize时,新插入的任务进入workQueue排队(如果workQueue长度允许),等待空闲线程来执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值