什么是线程池?
线程池就是提前创建若干个线程,当有任务需要去处理时,会去调用线程池中的线程去处理,当处理完后,它不会直接被销毁,而是等待下一个任务。因为我们在创建线程或销毁线程都会消耗系统的资源,所以如果频繁的创建和销毁线程时,我们可以考虑使用线程池来提高系统的性能。
在java中有三个常用的线程池:
1)FixedThreadPool
2) SingleThreadExecutor
3) CachedThreadPool (这个较为常用)
1.第一种线程池在创建时,它的线程数量是固定的,当需要运行的线程数量大体上变化不大时,适合使用这种线程池。因为固定线程数它的好处是:一次性进性进行线程的开销,之后再使用时就不会再需要消耗系统的资源了。
2.第二种线程池在创建时,它只会创建线程数量为1的线程池,所有提交的这个线程池的任务都会按照提交的先后顺序排队执行。单个线程执行的好处是:由于任务之间没有并发执行的,因此提交到线程池中的任务之间不会相互干扰。程序执行的结果更具有确定性。
3.第三种线程池是与缓存有关的线程池,每次任务提交到线程池的时候,如果池中没有空闲的线程,线程池就会为这个任务创建一个线程,如果有空闲的线程,就会使用已有的空闲线程去执行任务。如果没有任务要执行的话,它就会将已有的线程进行销毁,因为这个线程池中存在一个销毁机制,如果线程在规定的时间内没有被使用过,则这个线程就会被销毁,这样就会节省很多的资源。
线程池的使用:
线程池的使用只需要用到一个接口和一个类就行了。
ExecutorService 是所有线程池都实现了的接口,如果要用到这个接口可以定于句柄。
Executors类 用于创建不同种类的线程池,Executor,new***(); 就可以返回一个线程池对象,***表示的是线程池的名字。
public class CreateThreadPool{
public static void main(String[] args) {
//定义一个有5个线程的线程池
ExecutorService fixedTP = Executors.newFixedThreadPool(5);
ExecutorService singleTE = Executors.newSingleThreadExecutor();
ExecutorService cachedTP = Executors.newCachedThreadPool();
}
}