Java四种线程池的使用

来源:互联网 发布:板式家具用什么软件 编辑:程序博客网 时间:2024/05/03 22:31

http://cuisuqiang.iteye.com/blog/2019372

http://www.cnblogs.com/riskyer/p/3263032.html

http://blog.csdn.net/mazhimazh/article/details/19243889

         Sun在java5中,对Java线程的类做了大量的扩展,其中线程池就是Java5的新特性之一,除了线程池外,还有很多线程相关的内容,为多线程的编程带来了恶极大的便利,为了编写高效稳定的多线程,线程部分的新增内容显得尤为重要,
         线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了总舵(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象带来的性能开销,节省了系统的资源
         在Java5之前,要实现一个线程池相当有难度,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,就可享受线程池带来的极大便利。
         Java5的线程池分为多种:固定尺寸的线程池、可变长度的连接处,。

Java通过Executors提供四种线程池,newCacheThreadPool(),newFixedThreadPool(),newScheduedThreadPool(),newSingleThreadPool()

newCacheThreadPool(), 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,如果线程池长度小于处理需求,则新建线程
 newFixedThreadPool(),创建一个定长的线程池,可控制现场最大并发数,超出的线程会在线程队列中等待
ewScheduledThread()创建一个定长的线程池,支持定时,周期性的执行任务
newSingleThreadExecutor(),创建一个单线程化的线程池,它只会用唯一的工作线程类执行任务,保证所有任务按照指定顺序执行;

newCacheThreadPool

<span style="font-family:KaiTi_GB2312;font-size:12px;">public class Main {public static void main( String[] args ) {ExecutorService executors = Executors.newCachedThreadPool();SleepTread mSleepTread;for ( int i = 0 ; i < 30 ; i++ ) {mSleepTread = new SleepTread();executors.execute(mSleepTread);}executors.shutdown();}static class SleepTread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(1500);} catch ( InterruptedException e ) {e.printStackTrace();}System.out.println(this.getName() + " ----- ");}}}</span>
 这种线程池在一下加入多个任务的时候,长度会变得很大,会一直新建线程,当没有任务时,空闲线程会被回收


newFixedThreadPool

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {ExecutorService executors = Executors.newFixedThreadPool(3);SleepTread mSleepTread;for ( int i = 0 ; i < 30 ; i++ ) {mSleepTread = new SleepTread();executors.execute(mSleepTread);}executors.shutdown();}</span>

这个线程固定长度,


newScheduledThreadPool

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {ScheduledExecutorService executors = Executors.newScheduledThreadPool(5);SleepTread mSleepTread;for ( int i = 0 ; i < 30 ; i++ ) {mSleepTread = new SleepTread();//executors.execute(mSleepTread);//延迟多上时间执行,时间单位executors.schedule(mSleepTread, 3, TimeUnit.SECONDS);}executors.shutdown();}</span>
定时,或者循环执行的线程池,可定时,并不是execute执行,如果execute执行就没有效果延迟效果,对应还有两个方法,scheduleAtFixedRate(),和ScheduleWithFixedDelay(),第二个参数为任务执行完之后间隔下一个任务的停顿时间,第三个参数为最开始没执行任务时的等待时间

newSingleThreadExecutor

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {ExecutorService executors = Executors.newSingleThreadExecutor();SleepTread mSleepTread;for ( int i = 0 ; i < 30 ; i++ ) {mSleepTread = new SleepTread();executors.execute(mSleepTread);}executors.shutdown();}</span>
单例模式的线程池,同事只有一个任务在执行.还有单例可延迟的线程池ScheduleExecutorService

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {ScheduledExecutorService executors = Executors.newSingleThreadScheduledExecutor();SleepTread mSleepTread;for ( int i = 0 ; i < 30 ; i++ ) {mSleepTread = new SleepTread();//executors.execute(mSleepTread);executors.schedule(mSleepTread, 3, TimeUnit.SECONDS);}executors.shutdown();}</span>




0 0