Java 线程池详解

来源:互联网 发布:video.js flash 编辑:程序博客网 时间:2024/05/22 17:11

Java 线程池学习

Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6]

[1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池。

[2]中介绍了java.util.concurrent.Executors类的API。

[3]中介绍了Java中线程池的类体系结构。

[4]中有ThreadPoolExecutor的实例应用。

[5]中有线程池的实例讲解,实现了一个基于线程池的端口监听服务器。★

[6]中有对源码比较细致的分析,而且排版不错( ^_^ )

 

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。下面这张图完整描述了线程池的类体系结构。

标记一下比较重要的类:

ExecutorService:真正的线程池接口。ScheduledExecutorService能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。ThreadPoolExecutorExecutorService的默认实现。ScheduledThreadPoolExecutor继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
  • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
  • newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

那我个人感觉就是new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEPALIVE_TIME, TIME_UNIT, workQueue, rejectedExecutionHandler);提供了更定制化的线程池制造方法。因为newFixedThreadPool方法其实也是return new ThreadPoolExecutor


 

java.util.concurrent.Executors类的API提供大量创建连接池的静态方法:

1.固定大小的线程池:

package BackStage;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class JavaThreadPool {
    public static void main(String[] args) {
// 创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
// 关闭线程池
pool.shutdown();
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
System.out.println(Thread.currentThread().getName() + "正在执行。。。");
    }
}

2.单任务线程池:

//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 
ExecutorService pool = Executors.newSingleThreadExecutor(); 

对于以上两种连接池,大小都是固定的,当要加入的池的线程(或者任务)超过池最大尺寸时候,则入此线程池需要排队等待。一旦池中有线程完毕,则排队等待的某个线程会入池执行。

[2]中还介绍了:3.可变尺寸的线程池newChahedThreadPool;4.延迟连接池;5.单任务延迟连接池;6.自定义线程池

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 口腔溃疡经常发作是什么原因 经常口腔溃疡的原因 经常性口腔溃疡是什么原因 总是口腔溃疡是什么原因 口腔溃疡要吃什么 老长口腔溃疡是什么原因 常年口腔溃疡 一直口腔溃疡是什么原因 口腔溃疡传染不 口腔溃疡吃点什么好 口腔溃疡的症状是什么 容易长口腔溃疡是什么原因 为什么会长口腔溃疡 口腔溃疡长期不愈是什么原因 长期长口腔溃疡是什么原因 长期口腔溃疡是什么原因 口腔溃疡是什么原因造成的 嘴里经常口腔溃疡是什么原因 口腔溃疡的发病原因 经常性的口腔溃疡 反复性口腔溃疡 怎么会得口腔溃疡 口腔溃疡会引起发烧吗 口腔溃疡怎么引起的 口腔容易溃疡是什么原因 口腔溃疡反反复复是什么原因 口腔溃疡用什么好 经常得口腔溃疡是什么原因 口腔溃疡如何快速好 长口腔溃疡的原因 口腔溃疡是缺什么 引起口腔溃疡的原因有哪些 口腔溃疡吃什么好得快 总口腔溃疡是什么原因 口腔溃疡一直不好是什么原因 口腔溃疡是怎样引起的 口腔上颚溃疡的原因 容易口腔溃疡 口腔溃疡的原因有哪些 经常口腔溃疡是缺什么维生素 常年口腔溃疡什么原因