1、为什么要用程池:一、减少线程创建和销毁开销 二、当前任务与主线程隔离,实现和主线程异步执行
2、线程池分类:
Java类库提供了许多静态方法来创建一个线程池:
a、newFixedThreadPool 创建一个固定长度的线程池,当到达线程最大数量时,线程池的规模将不再变化。b、newCachedThreadPool 创建一个可缓存的线程池,如果当前线程池的规模超出了处理需求,将回收空的线程;当需求增加时,会增加线程数量;线程池规模无限制。
c、newSingleThreadPoolExecutor 创建一个单线程的Executor,确保任务对了,串行执行
d、newScheduledThreadPool 创建一个固定长度的线程池,而且以延迟或者定时的方式来执行,类似Timer;
3、
package com.chen.threadpool;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadpool_01 {
public static void main(String[] args) {
/*ExecutorService es = Executors.newCachedThreadPool();
int cpunums = Runtime.getRuntime().availableProcessors();//获取当前系统cpu数目
System.out.println(cpunums);
ExecutorService ex = Executors.newFixedThreadPool(cpunums);
while(true){
// ex.execute(new Handle());
}*/
testcachepool();
}
public static void testcachepool(){
System.out.println("Main: Starting at: "+ new Date());
ExecutorService exs = Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
exs.execute(new Handle(String.valueOf(i)));
}
exs.shutdown();//执行到此处不会马上关闭线程池,但不能向线程池继续添加线程
System.out.println("Main: Finished all threads at"+ new Date());
}
}
class Handle implements Runnable{
private String name;
public Handle(String name) {
super();
this.name = "Thread "+name;
}
public void run() {
// TODO Auto-generated method stub
System.out.println( name +" Start. Time = "+new Date());
processCommand();
System.out.println( name +" End. Time = "+new Date());
}
private void processCommand() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString(){
return this.name;
}
}
从上面的结果可以看出:
1、主线程的执行与线程池里的线程分开,有可能主线程结束了,但是线程池还在运行
2、放入线程池的线程并不一定会按其放入的先后而顺序执行