JAVA线程池的使用

一,线程池的作用

       线程池作用就是限制系统中执行线程的数量。
      
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列

      同时使用线程池可以:

      (1)减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务

      (2)可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

二,线程池中相关接口/类

2.1 主要接口

java.util.concurrent.Executor

  • java.util.concurrent.ExecutorService
    • java.util.concurrent.ScheduledExecutorService
Executor: 是线程池中定义的超级接口,其仅定义了一个抽象方法 execute(Runnable),此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法


ExecutorService: 该接口继承自Executor, 它提供了管理线程池终止的方法,并且可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。

ScheduledExecutorService:  继承自ExecutorService, 可安排在给定的延迟后运行或定期执行的命令。schedule方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。scheduleAtFixedRate和scheduleWithFixedDelay方法创建并执行某些在取消前一直定期运行的任务。


2.2 主要类

抽象类:AbstractExecutorService: 此类使用newTaskFor返回的 RunnableFuture 实现submit、invokeAny和invokeAll方法,默认情况下,RunnableFuture 是此包中提供的 FutureTask 类。

重要的类:ThreadPoolExecutor: ExecutorService的实现。为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook)。但是,强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和 Executors.newSingleThreadExecutor()(单个后台线程),它们均为大多数使用场景预定义了设置。

ThreadPoolExecutor创建方式:

(1)newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

(2)newSingleThreadExecutor:创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行 后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

(3)newCachedThreadPool:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

重要的类:ScheduledThreadPoolExecutor, 继承自ThreadPoolExecutor,并且实现了ScheduledExecutorService接口。它可另行安排在给定的延迟后运行命令,或者定期执行命令。需要多个辅助线程时,或者要求 ThreadPoolExecutor 具有额外的灵活性或功能时,此类要优于 Timer。

(1)newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要, 一个新线程会代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newScheduledThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

(2)newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。


你可能感兴趣的:(JAVA线程池的使用)