(一)Main线程是个非守护线程,不能设置成守护线程。

这是因为,main线程是由java虚拟机在启动的时候创建的。main方法开始执行的时候,主线程已经创建好并在运行了。对于运行中的线程,调用Thread.setDaemon()会抛出异常Exception in thread "main"     java.lang.IllegalThreadStateException。测试代码如下:

  1. public class MainTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(" parent thread begin ");
  6. Thread.currentThread().setDaemon(true);
  7. }
  8. }

(二)Main线程结束,其他线程一样可以正常运行。

主线程,只是个普通的非守护线程,用来启动应用程序,不能设置成守护线程;除此之外,它跟其他非守护线程没有什么不同。主线程执行结束,其他线程一样可以正常执行。代码如下:

  1. public class ParentTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println("parent thread begin ");
  6. ChildThread t1 = new ChildThread("thread1");
  7. ChildThread t2 = new ChildThread("thread2");
  8. t1.start();
  9. t2.start();
  10. System.out.println("parent thread over ");
  11. }
  12. }
  13. class ChildThread extends Thread
  14. {
  15. private String name = null;
  16. public ChildThread(String name)
  17. {
  18. this.name = name;
  19. }
  20. @Override
  21. public void run()
  22. {
  23. System.out.println(this.name + "--child thead begin");
  24. try
  25. {
  26. Thread.sleep(500);
  27. }
  28. catch (InterruptedException e)
  29. {
  30. System.out.println(e);
  31. }
  32. System.out.println(this.name + "--child thead over");
  33. }
  34. }
  35. --程序运行结果如下:
  1. parent thread begin
  2. parent thread over
  3. thread2--child thead begin
  4. thread1--child thead begin
  5. thread2--child thead over
  6. thread1--child thead over

这样其实是很合理的,按照操作系统的理论,进程是资源分配的基本单位,线程是CPU调度的基本单位。对于CPU来说,其实并不存在java的主线程和子线程之分,都只是个普通的线程。进程的资源是线程共享的,只要进程还在,线程就可以正常执行,换句话说线程是强依赖于进程的。也就是说,线程其实并不存在互相依赖的关系,一个线程的死亡从理论上来说,不会对其他线程有什么影响。

(三)Main线程结束,其他线程也可以立刻结束,当且仅当这些子线程都是守护线程。

java虚拟机(相当于进程)退出的时机是:虚拟机中所有存活的线程都是守护线程。只要还有存活的非守护线程虚拟机就不会退出,而是等待非守护线程执行完毕;反之,如果虚拟机中的线程都是守护线程,那么不管这些线程的死活java虚拟机都会退出。测试代码如下:

  1. public class ParentTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println("parent thread begin ");
  6. ChildThread t1 = new ChildThread("thread1");
  7. ChildThread t2 = new ChildThread("thread2");
  8. t1.setDaemon(true);
  9. t2.setDaemon(true);
  10. t1.start();
  11. t2.start();
  12. System.out.println("parent thread over ");
  13. }
  14. }
  15. class ChildThread extends Thread
  16. {
  17. private String name = null;
  18. public ChildThread(String name)
  19. {
  20. this.name = name;
  21. }
  22. @Override
  23. public void run()
  24. {
  25. System.out.println(this.name + "--child thead begin");
  26. try
  27. {
  28. Thread.sleep(500);
  29. }
  30. catch (InterruptedException e)
  31. {
  32. System.out.println(e);
  33. }
  34. System.out.println(this.name + "--child thead over");
  35. }
  36. }
  37. 执行结果如下:
  38. parent thread begin
  39. parent thread over
  40. thread1--child thead begin
  41. thread2--child thead begin

在这种情况下,的确主线程退出,子线程就立刻结束了,但是这是属于JVM的底层实现机制,并不是说主线程和子线程之间存在依赖关系

java主线程结束和子线程结束之间的关系的更多相关文章

  1. Java主线程如何等待子线程执行结束(转)

    工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...

  2. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  3. java主线程等待所有子线程执行完毕在执行(常见面试题)

    java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...

  4. Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下: public void run(); 而所有的具 ...

  5. c/c++中主线程退出,子线程也会退出

    #include <windows.h> #include <process.h> /* _beginthread, _endthread */ #include <io ...

  6. .Net主线程扑捉子线程中的异常

    首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 );        }        public void run()        {   ...

  7. Java主线程等待所有子线程执行完毕再执行解决办法(转)

    方法一: Thread.join()方法,亲测可行,thread.join()方法 Vector<Thread> ts = new Vector<Thread>(); for  ...

  8. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  9. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

随机推荐

  1. STL中的algorithm

    STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...

  2. hdu2041

    题目 这道题以前也看到过,但是没有写出来,我刚开始以为用循环遍历一边就可以了,结果我错了,没想到是用的斐波拉契推出来的,用的是递推的思想. 站在楼梯的第n级想一下,前一步是从哪里来的,问题就清楚了. ...

  3. Example11(June 9,2015)

    %--------------sort------------------------------- >> A=[ ; ; ] A = >> B=sort(A,)%A(:,)& ...

  4. Linux测试上行和下载速率

    下载安装speedtest-cli测试工具 方法一: pip3 install speedtest-cli 方法二: wget https://github.com/sivel/speedtest-c ...

  5. java 反射应用

    场景需求最近的一次解析数据包中,因为协议有改变,本来的定长的包,现在变为不定长的.举个例子,本来协议中规定,一个包中,有8个标签,但是每次上来的,不一定都有8个,没有的话,硬件过来的都是0.同时里面也 ...

  6. spring 注解实例

    先不说网上的那些例子了,百度到的都是一些零碎的东西.我之所以记博客,除了总结之外,很大一个原因是对网上的某些东西真的很无语. 拿注解来说,什么入门实例的东西,说是入门,却连一个基本的hello wor ...

  7. Chrome自定义缩放百分比

    我想要设置Chrome页面缩放为120%,但是Chrome只提供110% 125%,根本没有让我舒心的缩放比例. 强迫症发作,谷歌了半天没有一个很好的解决方案. 虽然也有不少第三方扩展可以自定义缩放比 ...

  8. Angular6 学习笔记——指令

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  9. SqlServer数据库同时备份到两台服务器上(并自动删除过期文件)

    数据库同时备份到两台服务器上(并自动删除过期文件) 举例 :(本地)服务器A: IP :192.168.1.1 (远程)服务器B: IP :192.168.1.2 数据库版本:SqlServer200 ...

  10. 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构

    本篇承接上篇内容,如果你不小心点击进来,建议重新从第一篇开始完整阅读. 构建NetCore应用框架之实战篇索引 一.BitAdminCore框架简介 从前篇论述我们知道,我们接下来将要去做一个管理系统 ...