线程池
构建一个新的线程是有一定代价的,因为涉及到与操作系统的交互。如果程序中需要使用大量生命周期很短的线程,就应该使用线程池。
将Runnable对象交给线程池来执行,就会有一个线程调用run方法,当run方法退出的时候,线程不会死亡,而是在池中准备为下一个请求提供服务。
另一个使用线程池的理由是为了减少并发编程的数目,创建大量线程会大大降低性能,甚至使虚拟机崩溃,而使用线程池能限制并发编程的总数。
线程池的创建和使用
而创建线程池对象需要使用执行器(Executors),注意要加s,Executor是个接口,而Executors才能创建线程池对象。
//创建一个不限数量的线程池,当执行一个任务的时候,如果有空闲线程用,会给它分配,如果没有空闲线程,就会创建一个新线程,空闲线程会被保留60秒
ExecutorService executor = Executors.newCachedThreadPool();
//创建一个具有固定数量的线程池,空闲线程也会被一直保留
ExecutorService executor2 = Executors.newFixedThreadPool(5);
//创建一个具有一个线程的线程池,由一个线程一个接一个的执行任务(感觉有点鸡肋)
ExecutorService executor3 = Executors.newSingleThreadExecutor();
//创建一个预定执行而构建的固定数量的线程池
ExecutorService executor4 = Executors.newScheduledThreadPool(5);
//创建一个用于预定执行而构建的只有一个线程的线程池
ExecutorService executor5 = Executors.newSingleThreadScheduledExecutor();
最常用的就是前三个,返回的都是ExecutorService对象,ExecutorService也是一个接口。
如果想要查看当前线程池中的线程数,不能使用ExecutorService接口对象获取,需要把它强转为它的子类,也就是ThreadPoolExecutor类对象,关于如何使用,在上一篇Callable与Future中有举例,地址:
https://www.cnblogs.com/Fill/p/9445908.html
原文地址:https://www.cnblogs.com/Fill/p/9446381.html
时间: 2024-10-09 18:14:37