线程池

补充

队列满时候的丢弃策略
  • DiscardPolicy:不处理,直接丢弃掉;
  • AbortPolicy:直接抛出 RejectedExecutionException 异常,这是默认的拒绝策略;
  • DiscardOldestPolicy:丢弃最老的任务,并执行当前任务;
  • CallerRunsPolicy:由调用线程本身运行任务,以减缓提交速度,会阻塞主线程;
说说submit和 execute两个方法有什么区别?

submit() 和 execute() 都可以往线程池中提交任务,区别是使用 execute() 执行任务无法获取到任务执行的返回值,而使用 submit()方法, 可以使用 Future 来获取任务执行的返回值。

shutdownNow() 和 shutdown() 两个方法有什么区别?

shutdownNow() 和 shutdown() 都是用来终止线程池的,它们的区别是,使用 shutdown() 程序不会报错,也不会立即终止线程,它会等待线程池中的缓存任务执行完之后再退出,执行了 shutdown() 之后就不能给线程池添加新任务了;shutdownNow() 会试图立马停止任务,线程中的任务不会再执行,也无法添加新的任务。

调用了shutdownNow或者shutdown,线程一定会退出么?

这个是不一定的,因为线程池会调用线程的interrupt()来打断线程的执行,但是这个方法不会打断正在运行的线程,只对正在阻塞等待的线程生效,一旦线程执行的任务类似于一个死循环,那么任务永远不会执行完,那么线程永远都不会退出。

为什么线程池要使用阻塞队列?

因为线程一旦任务执行完之后,如果想让线程不退出,只能阻塞或者自旋来保证线程不会退出,阻塞会让cpu资源,但是自旋不会,所以为了防止线程退出和减少cpu的消耗,选择使用阻塞队列来保证线程不会退出。