线程池的介绍

来源:互联网 发布:纽约卡车 知乎 编辑:程序博客网 时间:2024/06/05 02:39

为什么要使用线程池

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,

一:线程池的概念

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。从字面意思理解为存放线程的容器或者池子,用于存放线程。

注:(在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。

二:线程池的特性

1线程池线程都是后台线程。

2每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

三:线程池的组成部分

1线程池管理器(ThreadPoolManager:用于创建并管理线程池

2工作线程(WorkThread:线程池中线程

3任务接口(Task:每个任务必须实现的接口,以供工作线程调度任务的执行

(个人理解为标示和接口方法的实现)

4任务队列:用于存放没有处理的任务。提供一种缓冲机制(当线程池中没有可供使用的线程时,我们提供一个缓存,用于存放这些任务,以队列的形式)

四:线程的创建及运行时的状态

1

2

3

4

5

volatile int runState;

static final int RUNNING    = 0;

static final int SHUTDOWN   = 1;

static final int STOP       = 2;

static final int TERMINATED = 3;

   当创建线程池后,初始时,线程池处于RUNNING状态;

  如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;

  如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;

  当线程池处于SHUTDOWNSTOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态。

五:Java通过Executors提供四种线程池

 

1newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

2newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

4newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO,优先级)执行。

 

参考文档

Java并发编程之线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html

四种线程池:http://cuisuqiang.iteye.com/blog/2019372

 

 


 

 


原创粉丝点击