线程问题

一、手动创建并开启了一个线程

  此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的线程还没有执行完成,则会等待线程执行完毕,最终程序结束运行

  若想主程序结束,子程序立即结束,可以在线程开启之前设置其为守护线程

二、使用线程池提交了任务

  此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的任务还没执行完成,会等待执行完毕,最终程序不会结束运行,除非你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 但会阻塞到这里来,知道遍历完成才继续向下走

  1.  
posted @ 2020-09-17 08:56  helloworldmybokeyuan  阅读(257)  评论(0编辑  收藏  举报