黑马程序员技术交流社区
标题:
线程池的理解和使用
[打印本页]
作者:
xgm
时间:
2016-3-17 20:10
标题:
线程池的理解和使用
* 目的:了解线程池
* 线程池的概念:
* 创建一个池,池里面有固定(不固定)的一些线程,用来等待任务。
* 在线程执行完任务后,不会关闭线程(除非程序员手动关闭),而是继续等待任务。
*/
public class ExecutorsThreadPoolTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3); //创建固定数量的线程池
/**
* 下面这段代码分析
* 这段代码需要执行5个任务(每个任务执行3次),而线程池里面只有3个线程。
* 因此,需要执行第4个任务时,需要等前3个线程中的某个执行完毕。其他任务类似。
*/
/*
for(int j=0;j<5;j++){
final int poolnum = j;
threadPool.execute(new Runnable(){
public void run() {
for(int i=0;i<3;i++)
System.out.println(Thread.currentThread().getName()+"runnable is :"+i+" pool is"+poolnum);
}
});
}*/
/**
* Executors.newCachedThreadPool();是创建可根据需要来扩充的一种线程池。
* 如果线程中没有可用的线程,会创建一个新的线程添加到池中,否则使用池中已有的线程完成任务。
* 如果线程60秒未被使用会从缓存中移除
*/
ExecutorService threadPool1 = Executors.newCachedThreadPool();
/**
* Executors.newSingleThreadExecutor()创建单一线程的线程池
* 这种线程池在任务执行中途执行失败而终止了这个线程时,会创建一个新的线程继续完成这个任务
*/
ExecutorService threadPool3 = Executors.newSingleThreadExecutor();
/*for(int j=0;j<5;j++){
final int poolnum = j;
threadPool3.execute(new Runnable(){
public void run() {
for(int i=0;i<3;i++)
System.out.println(Thread.currentThread().getName()+"runnable is :"+i+" pool is"+poolnum);
}
});
}*/
/**
* 创建定时器炸弹的线程池,和上面三个差不多
* 有常用的两种调度方式
*/
ScheduledExecutorService timers = Executors.newScheduledThreadPool(3);
//定时器的第一种调度方式,多少秒之后say "I love you",TimeUnit设置时间格式
/*timers.schedule(new Runnable(){
public void run() {
System.out.println("I love you");
}
},2,TimeUnit.SECONDS);*/
//定时器的第一种调度方式,多少秒之后某某咆哮“只有上帝和野兽喜欢孤独”,之后每次间隔一秒咆哮一次
/*timers.scheduleAtFixedRate(new Runnable(){
public void run() {
System.out.println("只有上帝和畜生喜欢独孤");
}
}, 2, 1, TimeUnit.SECONDS);*/
System.out.println("thread pool is end");
/*
* 当我们没有手动关闭线程池时,线程池会一直等待任务。
* ExecutorService提供了两种关闭线程池的方法,
* 1、shutdown(); 当任务全部完成后,顺序关闭,不接受新的任务
* 2、shutdownnow(); 执行完正在执行的任务,暂停正在等待的任务,并返回等待任务列表list<Runnable>
*/
threadPool.shutdown();
threadPool.shutdownNow();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2