java线程池类学习

来源:互联网 发布:知善恶树 编辑:程序博客网 时间:2024/06/17 04:09

Executor:Java线程池的顶级接口,严格意义来讲是一个执行线程的工具

ExecutorService: 真正的线程池接口

ScheduledExecutorService: Timer类似,解决定时以及周期性执行任务的需求

ThreadPoolExecutor:ExecutorService的默认实现

ScheduledThreadPoolExecutor:继承ThreadPoolExecutor和ScheduledExecutorService,周期性任务调度的实现类。

刚看了一下jdk API图,感觉比上面文字描述更清楚,API截图如下:


Executors类中提供了一些静态方法来创建线程池的实例,主要方法如下:

newSingleThreadExecutor:

    创建一个单线程的线程池,这个线程池只有一个线程在工作,也就是相当于单线程在执行所有任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来代替它。此线程保证所有任务的执行顺序按照任务的提交顺序执行。


newFixedThreadPool:

    创建固定大小的线程池,每次提交一个任务,就创建一个线程,知道线程数达到线程池中最大线程数,线程池的大小一旦达到最大值就保持不变,如果每个线程因为执行异常而结束,那么线程池会补充一个新线程。

只需要修改上面类的名字和第6行代码:

...

注意线程池中始终只有两个线程。

另外在运行线程池的例子时我们会发现凡是线程池中的线程名字一般都是以pool-线程池编号-thread-线程编号

这在查看一些thread dump文件时可能会有用。

newCachedThreadPool:

   创建一个可缓存的线程池,如果线程池大小超过了处理任务所需要的线程,那么就回收部分空闲的线程。当任务增加时,此线程池有可以智能的增加线程来处理任务。此线程池不会对线程数大小做限制,线程池大小完全依赖于操作系统(或JVM)能够创建的线程大小。

示例代码同样是修改了类名和线程池实例的获得方法。

...


newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

示例代码:

下面这段代码来自jdk文档ScheduledExecutorService示范例子作了一些小改动

安排一个口技演员吹10(scheduleAtFixedRate第一个参数)秒以后第一次吹b-box,第二次吹的时间10+10(scheduleAtFixedRate第个参数)秒以后,第三次将是10+10*2秒以后,...,

照这样的规律重复"表演"(打印beep)下去

如果我们不再下面schedule方法的cancel掉这个口技表演,他将无休止的"表演"(打印beep)

我们是在"表演"(打印beep)持续一小时(60*60)以后取消"表演"

需要说明的是coreSize是1并不代表线程就创建1个,即使线程空闲的时候也会创建(jdk文档)



0 0