Java 线程池学习

1777阅读 0评论2012-07-18 qhw
分类: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类似,解决那些需要任务重复执行的问题。
ThreadPoolExecutor ExecutorService的默认实现。
ScheduledThreadPoolExecutor 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

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

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

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

1.固定大小的线程池:


点击(此处)折叠或打开

  1. package BackStage;
  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.ExecutorService;
  4. public class JavaThreadPool {
  5.     public static void main(String[] args) {
  6.     // 创建一个可重用固定线程数的线程池
  7.     ExecutorService pool = Executors.newFixedThreadPool(2);
  8.     // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
  9.     Thread t1 = new MyThread();
  10.     Thread t2 = new MyThread();
  11.     Thread t3 = new MyThread();
  12.     Thread t4 = new MyThread();
  13.     Thread t5 = new MyThread();
  14.     // 将线程放入池中进行执行
  15.     pool.execute(t1);
  16.     pool.execute(t2);
  17.     pool.execute(t3);
  18.     pool.execute(t4);
  19.     pool.execute(t5);
  20.     // 关闭线程池
  21.     pool.shutdown();
  22.     }
  23. }
  24. class MyThread extends Thread {
  25.     @Override
  26.     public void run() {
  27.     System.out.println(Thread.currentThread().getName() + "正在执行。。。");
  28.     }
  29. }

2.单任务线程池:

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

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

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

上一篇:区分Java创建线程几个方法
下一篇:HTTP请求模型和头信息