当前位置:   article > 正文

java线程池_newsinglethreadscheduledexecutor

newsinglethreadscheduledexecutor

为什么用使用线程池

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

2.提高线程的可管理性

Executors类

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

DelegatedExecutorService FinalizableDelegatedExecutorService DelegatedScheduledExecutorService

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

  1. public static ExecutorService newFixedThreadPool(int nThreads) {
  2. // 固定大小线程池
  3. return new ThreadPoolExecutor(nThreads, nThreads,
  4. 0L, TimeUnit.MILLISECONDS,
  5. new LinkedBlockingQueue<Runnable>());
  6. }
  1. public static ExecutorService newCachedThreadPool() {
  2. /* 处理大量短时间工作任务的线程池
  3. (1)试图缓存线程并重用,当无缓存线程可用时,会创建新的工作线程
  4. (2)如果线程闲置的时间超过阈值,则会被终止并移出缓存
  5. (3)系统长时间闲置的时候,不会消耗什么资源
  6. */
  7. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  8. 60L, TimeUnit.SECONDS,
  9. new SynchronousQueue<Runnable>());
  10. }
  1. public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
  2. // 创建唯一的工作者线程来执行任务,如果线程异常结束,会有另一个线程取代它
  3. return new DelegatedScheduledExecutorService
  4. (new ScheduledThreadPoolExecutor(1));
  5. }
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长度允许),等待空闲线程来执行
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/83735
推荐阅读
相关标签
  

闽ICP备14008679号