JAVA线程状态图

1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭)。

----1.1 一个进程中可以有很多的线程,可以在主线程上创建一个新线程(A),而在这个新线程(A)中可以再创建别的线程。这样的话,线程之间就可以层层嵌套;

CreateTread()函数中就有一个参数可以指定创建线程的入口(就是可以自定义一个线程启动入口),

----1.2 当父线程消亡的时候,子线程是不会消亡的,是会继续执行到结束的;

----1.3 当主线程消亡的时候,所有线程都得死。

2.Java中线程分为守护线程(如垃圾回收线程)和非守护线程(默认为非守护线程/用户线程),通过              setDaemon(true)方法将非守护线程变为守护线程;

----2.1默认情况下主线程结束,子线程未结束时,程序不结束;

  1. package base;
  2. class ThreadTest extends Thread {
  3. ThreadTest() {
  4. super("Demo Thread");
  5. System.out.println("Child thread: " + this);
  6. start();
  7. }
  8. @Override
  9. public void run() {
  10. try {
  11. for (int i = 5; i > 0; i--) {
  12. System.out.println("Child Thread: " + i);
  13. Thread.sleep(50);
  14. }
  15. } catch (InterruptedException e) {
  16. System.out.println("Child Interrupted.");
  17. }
  18. System.out.println("Exiting child thread.");
  19. }
  20. }
  21. //NOTE:主线程退出之后子线程仍然可以继续运行
  22. //NOTE:非守护线程
  23. public class NewThread {
  24. public static void main(String[] args) {
  25. new ThreadTest();
  26. System.out.println("Main thread exiting.");
  27. }
  28. }

结果如下图所示:

----2.2当子线程为守护线程时,主线程结束则其他子线程也结束,程序结束;

  1. class ThreadTest extends Thread {
  2. ThreadTest() {
  3. super("Demo Thread");
  4. System.out.println("Child thread: " + this);
  5. //将子线程t设置为守护线程
  6. setDaemon(true);
  7. start();
  8. }
  9. @Override
  10. public void run() {
  11. try {
  12. for (int i = 5; i > 0; i--) {
  13. System.out.println("Child Thread: " + i);
  14. Thread.sleep(50);
  15. }
  16. } catch (InterruptedException e) {
  17. System.out.println("Child Interrupted.");
  18. }
  19. System.out.println("Exiting child thread.");
  20. }
  21. }
  22. //NOTE:主线程退出之后子线程仍然可以继续运行
  23. //NOTE:非守护线程
  24. public class NewThread {
  25. public static void main(String[] args) {
  26. new ThreadTest();
  27. System.out.println("Main thread exiting.");
  28. }
  29. }

结果如下图所示:

两个区别在于

  1. JVM会在所有的非守护线程(用户线程)执行完毕后退出;
  2. main线程是用户线程;
  3. 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。

C++/Java线程之分的更多相关文章

  1. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  2. Java线程之synchronized

    翻译:https://www.journaldev.com/1061/thread-safety-in-java 我们知道线程安全在Java中是一个非常重要的主题,当多个线程操作共享数据时,如果没有任 ...

  3. Java线程之wait()、notify()、notifyAll()

    翻译:https://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 简述 java中Objct对象包含三个 ...

  4. Java线程之Phaser

    Phaser是一个灵活的线程同步工具,他包含了CyclicBarrier和CountDownLatch的相关功能 首先,来看一下如何用Phaser替代CountDownLatch.对于CountDow ...

  5. java 线程之executors线程池

    一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...

  6. java 线程之concurrent中的常用工具 CyclicBarrier

    一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...

  7. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  8. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  9. Java线程之Java内存模型(jmm)

    一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial

随机推荐

  1. DOM节点的基础操作

    1.寻找节点 //寻找节点 id方法 document.getElementById(); //标准 //寻找节点层次方法 parentNode().firstChild()和lastChild(): ...

  2. js实现数字千分位

    /** * * @param num * @param precision * @param separator * @returns {*} *=========================== ...

  3. Bloom Filter 数据结构去重

    Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合. Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于 ...

  4. mimkatz 用法

    mimikatz用法 privilege::debug    进入debug模式 sekurlsa::logonPasswords 查看所有用户密码 sekurlsa::wdigest 读取当前登录用 ...

  5. es中如何定位不合法搜索

    GET /test_index/test_type/_validate/query?explain{ "query": { "math": { "te ...

  6. tomcat 的acceptCount、acceptorThreadCount、maxConnections、maxThreads 如何确定

    acceptCount 连接在被ServerSocketChannel accept之前就暂存在这个队列中,acceptCount就是这个队列的最大长度. ServerSocketChannel ac ...

  7. docker端口映射或启动容器时报错

    原始镜像如下: REPOSITORY TAG IMAGE ID CREATED SIZE xtjatswc/mycore2 v3 73ce3cd97c01 About an hour ago .74G ...

  8. linux服务器性能查看

    1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l 2.查看每个物理cpu ...

  9. 微服务——RestTemplate

    GET请求: 第一种:getForEntity: 此方法返回的是ResponseEntity,该对象是Spring对HTTP请求响应的封装. RestTemplate rt = new RestTem ...

  10. js并归排序的思路

    并归排序,就是分而治之,将长的数组分解为短的数组,一直分到最后,单个单个数组,我们就认为,只有一个元素的数组是有序的.然后再逐个的合并 1.拆分: 很容易 例如数组  [ 2,4,3,5,1,6,8, ...