一、线程介绍
1、线程池概念
其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反
复创建线程而消耗过多资源。
2、为什么需要线程池
在我们现在所学习的知识里面,一旦我们需要使用线程的时候我们就会去创建一一个线程,这样看上去非常
简便,但是就会有一个问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会
大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有-种办法使得线程可以复用,就是
执行完一个任务, 并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。
二、线程池理解
三、线程池的优势
1.降低资源消耗
。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.提高响应速度
。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。
3.提高线程的可管理性
。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为
消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存
也就越大,最后死机)。
四、线程池构建步骤
➢1.创建线程池对象。(Executors)
public static ExecutorService newFixedThreadPool(int nThreads):创建一一个指定 现场数量的线程
池对象
➢2.创建Runnable接口子类对象。
实现Runnable接口,重写run方法;
➢3.提交Runnable接口子类对象。
调用线程池对象的submit方法来启动线程去执行任务: submit(Runnable子 类对象);
➢4.关闭线程池(一般不做)。
submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭,将使用完的线程又归还到
了线程池中,shutdown(
五、基本使用
- 线程池的基本使用
- 1、使用线程池的工具类Executors里面所提供的静态方法newFixedThreadPool(int nThreads) 来构建一个
- 指定线程数量的线程池对象;
- 2、创建一个Runnable的子类,然后在run方法中写明你的任务逻辑代码;
- 3、通过创建出来的ExecutorService对象中的submit方法来执行你所创建的Runnable子类;
- 4、如果你确定不再使用线程池了,那么可以关闭它!
public class ThreadPoolDemo {
public static void main(String[] args) {
//1、使用线程池的工具类Executors里面所提供的静态方法newFixedThreadPool(int nThreads)
//来构建一个指定线程数量的线程池对象;
ExecutorService es = Executors.newFixedThreadPool(2);
//3、通过创建出来的ExecutorService对象中的submit方法来执行你所创建的Runnable子类;
es.submit(new RunnableImp());
es.submit(new RunnableImp());
es.submit(new RunnableImp());
//4、如果你确定不再使用线程池了,那么可以关闭它!
es.shutdown();
//5、如果你关闭了线程池,你还在使用线程池的话,会导致什么结果?
es.submit(new RunnableImp());//RejectedExecutionException
}
}
//2、创建一个Runnable的子类,然后在run方法中写明你的任务逻辑代码;
class RunnableImp implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":创建了一个新线程!");
//加上一个业务逻辑的执行时间
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}