什么是线程池
创建和销毁对象是非常耗费时间的
创建对象:需要分配内存等资源
销毁对象:虽然不需要程序员操心,但是垃圾回收器会在后 台一直跟踪并销毁
对于经常创建和销毁、使用量特别大的资源,比如并发情况 下的线程,对性能影响很大。
**思路:**创建好多个线程,放入线程池中,使用时直接获取引
用,不使用时放回池中。可以避免频繁创建销毁、实现重复 利用 生活案例:在尚学堂借用和归还电脑、共享单车 技术案例:线程池、数据库连接池 JDK1.5 起,提供了内置线程池
线程池的好处
-
提高响应速度(减少了创建新线程的时间)
-
降低资源消耗(重复利用线程池中线程,不需要每次都创 建)
-
提高线程的可管理性:避免线程无限制创建、从而销毁系 统资源,降低系统稳定性,甚至内存溢出或者 CPU 耗尽
线程池的应用场合
-
需要大量线程,并且完成任务的时间短
-
对性能要求苛刻
-
接受突发性的大量请求
public class Test1 {
public static void main(String[] args) {//如何创建一个线程池
//(1)创建一个线程池,线程池中只有一个线程对象
//ExecutorService pool1=Executors.newSingleThreadExecutor();//(2)创建一个线程池,线程池中有线程的数量固定
//ExecutorService pool1=Executors.newFixedThreadPool(10);//(3)创建一个线程池,线程池中的线程的数量可以动态的改变
ExecutorService pool1=Executors.newCachedThreadPool();/*使用线程池执行大量的Runnable命令/
for(int i=0;i<20;i++){
final int n=i;
//使用匿名内部类//任务
Runnable command=new Runnable() {
@Override
public void run() {
System.out.println(“开始执行:”+n);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“执行结束:”+n);
}
};//任务结束
//将任务交给线程池中的线程去执行
pool1.execute(command);}
//关闭线程池
pool1.shutdown();}
}
public class Test2 {
public static void main(String[] args) throws InterruptedException, ExecutionException {// 如何创建一个线程池
// (1)创建一个线程池,线程池中只有一个线程对象
//ExecutorService pool1=Executors.newSingleThreadExecutor();// (2)创建一个线程池,线程池中有线程的数量固定
ExecutorService pool1=Executors.newFixedThreadPool(10);// (3)创建一个线程池,线程池中的线程的数量可以动态的改变
//ExecutorService pool1 = Executors.newCachedThreadPool();//创建一个集合
List list=new ArrayList();
/*使用线程池执行大量的Callable任务/
for(int i=0;i<20;i++){
//使用匿名内部类
//创建任务
Callable task=new Callable() {@Override
public Integer call() throws Exception {
Thread.sleep(2000);
return (int)(Math.random()*10)+1;
}
}; //任务结束
//将任务交能线程池
Future f=pool1.submit(task);list.add(f);
//System.out.println(f.get());
}
System.out.println(“ok?”);
//遍历集合
for(Future ff:list){
System.out.println(ff.get());
}
System.out.println(“OK!”);
//关闭线程池
pool1.shutdown();}
}