• 线程问题


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

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

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

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

      此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的任务还没执行完成,会等待执行完毕,最终程序不会结束运行,除非你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.  
  • 相关阅读:
    进度条加载
    插件
    倒计时
    阿里云oss教程
    拖拽排序插件 ---- Dragula
    预览图片代码
    Error: spawn xxxx ENOENT原因与解决
    关于环境配置的随笔
    js下载文件
    QuickStart系列:docker部署之redis
  • 原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/13683231.html
Copyright © 2020-2023  润新知