zoukankan      html  css  js  c++  java
  • 线程问题

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

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

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

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

      此时主程序会继续向下执行,不会停在这里,如果主程序执行完成而开启的任务还没执行完成,会等待执行完毕,最终程序不会结束运行,除非你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.  
  • 相关阅读:
    mysql备份数据及导入数据
    django.db.migrations.graph.NodeNotFoundError: Migration travel_list.0001_initial dependencies reference nonexistent parent node ('employer', '0001_initial')问题
    JAVA 两个对象不同为什么他们的hashcode有可能相同
    Java序列化的作用和反序列化
    Java语言中的值传递与引用传递
    Java中关键字this、super的含义及使用
    java redis client jedis 测试及常用命令
    使用AJAX报406错误
    Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
    连接zookeeper+solr的服务器超时
  • 原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/13683231.html
Copyright © 2011-2022 走看看