前言
对应从事后端开发的同学来说,线程是必须要使用了,因为使用它可以提升系统的性能。但是,创建线程和销毁线程都是比较耗时的操作,频繁的创建和销毁线程会浪费很多CPU的资源。此外,如果每个任务都创建一个线程去处理,这样线程会越来越多。我们知道每个线程默认情况下占1M的内存空间,如果线程非常多,内存资源将会被耗尽。这时,我们需要线程池去管理线程,不会出现内存资源被耗尽的情况,也不会出现频繁创建和销毁线程的情况,因为它内部是可以复用线程的。
从实战开始
在介绍线程池之前,让我们先看个例子。
public class MyCallable implements Callable { @Override public String call() throws Exception { System.out.println("MyCallable call"); return "success"; } public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); try { Future future = threadPool.submit(new MyCallable()); System.out.println(future.get()); } catch (Exception e) { System.out.println(e); } finally { threadPool.shutdown(); }}}
这个类的功能就是使用Executors类的newSingleThreadExecutor方法创建了的一个单线程池,他里面会执行Callable线程任务。
创建线程池的方法
我们仔细看看Executors类,会发现它里面给我们封装了不少创建线程池的静态方法,如下图所示:
![eb0a78e570b18532831bee1e45bfd6ea.png](https://i-blog.csdnimg.cn/blog_migrate/0e547957075bb1c74e0de8a61ad6fe1a.jpeg)
其实,我们总结一下其实只有6种:
1.newCachedThreadPool可缓冲线程池
![9e4a68f3a731be4eb8611b41be008f82.png](https://i-blog.csdnimg.cn/blog_migrate/58d5a39e6df74791ab416340475bb109.jpeg)
它的核心线程数是0,最大线程数是integer的最大值,每隔60秒回收一次空闲线程,使用SynchronousQueue队列。SynchronousQueue队列比较特殊,内部只包含一个元素,插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列