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

java线程池

2016-12-26 23:55 387 查看
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、放入线程池的线程并不一定会按其放入的先后而顺序执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: