Thread Pool
1、 为了避免系统频繁的创建和销毁线程,我们可以将创建的线程进行复用。
2、 在线程池中总有那么几个活跃的线程,也有一定的最大值限制,一个业务使用完线程之后,不是立即销毁而是将其放入到线程池中,从而实现线程的复用。简而言之:创建线程变成了从线程池获取空闲的线程,关闭线程变成了向池子中归还线程。
3、 线程池优点:
1) 可重复使用已有线程,避免对象创建、消亡和过度切换的性能开销。
2) 避免创建大量同类线程所导致的资源过度竞争和内存溢出的问题。
4、 创建线程池有两种方式:ThreadPoolExecutor 和 Executors
ThreadPoolExecutor
1、 submit() 用于提交需要返回值的任务。线程池会返回一个 future 类型的对象,通过这个 future 对象可以判断任务是否执行成功。
2、 可以通过 future 的 get() 方法来获取返回值,get() 方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
3、 使用 submit 的坑:
1) 使用 execute() 代替 submit()
2) 使用 Future
4、 execute() 方法输入的任务是一个 Runnable 类的实例,用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。
5、 线程池关闭,