您的位置:首页 > 编程语言 > Java开发

Java四种线程池的使用

2015-01-05 18:33 627 查看
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 {
@Override
public 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: