Java并发编程札记-(六)JUC线程池-01概述

时间:2018-01-04 19:15:41

前面的例子中总是需要线程时就创建,不需要就销毁它。但频繁创建和销毁线程是很耗资源的,在并发量较高的情况下频繁创建和销毁线程会降低系统的效率。线程池可以通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
参考JDK1.8中的相关类,画出下图。
MarkdownPhotos/master/CSDNBlogs/concurrency/0201/threadPool.png
本章只是简单地介绍下它们,在以后的文章中会选一些最重要的来学习。

Executor
此接口提供一种将任务提交与每个任务将如何运行的机制分离开来的方法。它只提供了execute(Runnable)这么一个方法,用于执行已提交的Runnable任务。

ExecutorService
继承了Executor接口,用于提交一个用于执行的Runnable任务、试图停止所有正在执行的活动任务,暂停处理正在等待的任务、执行给定的任务。

AbstractExecutorService
提供了ExecutorService的默认实现。

ThreadPoolExecutor
提供一个可扩展的线程池实现,是最出名的“线程池”。

ForkJoinPool
JDK1.7中新增的一个线程池,与ThreadPoolExecutor一样,同样继承了AbstractExecutorService。ForkJoinPool是Fork/Join框架的两大核心类之一。与其它类型的ExecutorService相比,其主要的不同在于采用了工作窃取算法(work-stealing):所有池中线程会尝试找到并执行已被提交到池中的或由其他线程创建的任务。这样很少有线程会处于空闲状态,非常高效。这使得能够有效地处理以下情景:大多数由任务产生大量子任务的情况;从外部客户端大量提交小任务到池中的情况。

ScheduledExecutorService
继承了ExecutorService,可安排在给定的延迟后运行或定期执行命令。

ScheduledThreadPoolExecutor
继承了ThreadPoolExecutor,实现了ScheduledExecutorService。

Executors
配置线程池是比较复杂的工作,为了方便用户使用,Executors中为创建Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable对象提供了便捷的静态工厂方法。比如

  • callable(Runnable task, T result) :返回 Callable 对象,调用它时可运行给定的任务并返回给定的结果。
  • defaultThreadFactory() :返回用于创建新线程的默认线程工厂。
  • newCachedThreadPool() :创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
  • newFixedThreadPool(int nThreads) :创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
  • newScheduledThreadPool(int corePoolSize) :创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
  • newSingleThreadExecutor() :创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
  • newSingleThreadScheduledExecutor() :创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。
  • newWorkStealingPool():创建work-stealing线程池,JDK1.8新增

未完待续。。。

本文就先讲到这里,想了解Java并发编程更多内容请参考:

  • Java并发编程札记-目录
作者:panweiwei1994 发表于2018/1/4 21:15:41 原文链接
阅读:1 评论:0 查看评论