java线程(四) 线程池
1. 原理:
? ? ? ??线程池的基本思想是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源?,类似于数据库连接池等。从系统资源的角度看,在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”?,?线程池就可以用于限制任何给定时刻处理的请求数目,避免创建过多的线程导致系统崩溃。?
2. 线程池的种类:
固定大小的线程池:创建固定线程数量的线程池,如果任务数大于线程池中线程的数量,那么任务将等待
单任务线程池:创建一个线程的线程池,相当于单线程串行执行所有任务。
可变尺寸的线程池?:根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们
定时器线程池:指定线程池中线程在多长时间后执行,以及每个多长时间执行一次
3.示例代码:
?
代码1:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author lcy * *2012-5-22 */public class Test { public static void main(String[] args) { //创建一个可重用固定线程数的线程池 // ExecutorService pool = Executors.newFixedThreadPool(2); //单任务线程池 // ExecutorService pool = Executors.newSingleThreadExecutor(); //创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 ExecutorService pool = Executors.newCachedThreadPool(); 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()+"正在执行。。。"); } }- import?java.util.concurrent.Executors;??
- import?java.util.concurrent.ScheduledExecutorService;??
- import?java.util.concurrent.TimeUnit;??
- ??
- /**?
- ?*?@author?lcy?
- ?*??
- ?*2012-5-22?
- ?*/??
- public?class?Test2?{???
- ????public?static?void?main(String[]?args)?{???
- ????????????//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。???
- ????????????ScheduledExecutorService?pool?=?Executors.newScheduledThreadPool(3);???
- ????????????//创建实现了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.schedule(t4,?10,?TimeUnit.MILLISECONDS);???
- ????????????pool.schedule(t5,?10,?TimeUnit.MILLISECONDS);???
- ????????????//关闭线程池???
- ????????????pool.shutdown();???
- ????}???
- }???
- ??
- class?MyThread2?extends?Thread?{???
- ????@Override???
- ????public?void?run()?{???
- ????????????System.out.println(Thread.currentThread().getName()?+?"正在执行。。。");???
- ????}???
- }