线程问题
一、手动创建并开启了一个线程
此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的线程还没有执行完成,则会等待线程执行完毕,最终程序结束运行
若想主程序结束,子程序立即结束,可以在线程开启之前设置其为守护线程
二、使用线程池提交了任务
此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的任务还没执行完成,会等待执行完毕,最终程序不会结束运行,除非你shutdown掉线程池。注意shutdown 不是立刻关闭的意思,会等到执行完了再关闭,并且此方法不阻塞,主程序可以继续向下执行,因此无法以此来决定主线程在子任务都执行完成之后,继续执行
shutdown()
将线程池状态置为SHUTDOWN,并不会立即停止:
停止接收外部submit的任务
内部正在跑的任务和队列里等待的任务,会执行完
等到第二步完成后,才真正停止
shutdownNow()
将线程池状态置为STOP。企图立即停止,事实上不一定:
跟shutdown()一样,先停止接收外部提交的任务
忽略队列里等待的任务
尝试将正在跑的任务interrupt中断
返回未执行的任务列表
它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
但是大多数时候是能立即退出的
awaitTermination()
接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。
三、特别的ForkJoinPool 是守护线程,如果你没有用get阻塞主程序等待结果,主程序完成子程序自动结束。
四、list.parallelStream() .forEach()底层用到了ForkJoinPool 但会阻塞到这里来,知道遍历完成才继续向下走