(一)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. linux几种查看日志的方法

    linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...

  2. [笔记]学习EBS建议有的知识

    http://f.dataguru.cn/thread-51057-1-1.html ORACLE EBS学习的其他资源有哪四个? ORACLE OPEN WORLD大会是不是一个市场营销活动? Or ...

  3. SpringBoot tomcat

    该文的前提是已经可以在控制台运行成功,有些时候想放在tomcat里运行 大致分为如下几步 1.配置文件更改 <dependency> <groupId>org.springfr ...

  4. 自适应XAML布局经验总结 (四)区域布局设计模式

    本系列对实际项目中的XAML布局场景进行总结,给出了较优化的自适应布局解决方案,希望对大家有所帮助. 下面介绍区域布局设计模式. 7. 头尾模式 页面有时分为顶部栏,中间内容和底部栏三部分.这时可以使 ...

  5. 谈谈XAML前端开发

    GUI的发展 在图形用户界面的操作系统(Windows,MAC)出现之前,计算机软件是命令行界面的程序,用户和程序的交互是通过输入命令,查看命令运行结果进行的.当然很不友好.后来出现了文本图形界面的程 ...

  6. GitHub设置使用SSH Key,用TortoiseGit进行Clone仓库

    GitHub设置使用SSH Key的好处就是可以使用SSH连接,并且提交代码的时候可以不用输入密码,免密提交. 生成SSH Key 这里我们使用PuTTYgen来生成公钥(Public Key),私钥 ...

  7. VS版本与系统不兼容问题

    1.VS2012在win7 64位系统安装快结束时报出一个不兼容的错误. 2.这种情况官方给出解决方法: http://www.microsoft.com/en-us/download/details ...

  8. dD Geometry Kernel ( Geometry Kernels) CGAL 4.13 -User Manual

    1 Introduction This part of the reference manual covers the higher-dimensional kernel. The kernel co ...

  9. NET项目发布到IIS上报错:HTTP 错误 403.14

    NET项目发布到IIS上报错:HTTP 错误 404.0 - Not Found 原因:由于本机开发环境是Net4.5,所以虽然创建项目时选择的是net framework4.5的,但是webconf ...

  10. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...