`

守护线程、非守护线程(用户线程)(转)

    博客分类:
  • java
阅读更多

 

1、 java命令和 javaw命令是怎么回事?

我现在的理解:

java命令在执行一个class文件的时候,

1)首先要创建一个虚拟机实例

2)虚拟机启动用户主线程 main()方法,这是非守护线程

3)虚拟机(也可能是主线程)启动守护线程。比如垃圾收集线程。

4main()方法结束,并且由main()方法创建的用户线程也结束。也就是说系统中没有用户线程存在了,则守护线程也结束,最后虚拟机实例自动销毁。

javaw命令在eclipse启动后,也是代表了一个虚拟机实例。它一直存在应该是因为系统中有用户线程一直在后台运行。

eclipse被关闭是,应该是调用了systemexist()方法,即虚拟机实例强行销毁。

当用户自己编写的class文件在eclipse中执行时,由javaw这个虚拟机实例解释执行。

2、 下面是网上资料总结如下:

Java有两种Thread:“守护线程Daemon”与“用户线程User”。

从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:

用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。

守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。

setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。

下面是演示程序:

----------------------------------------------------------------

import java.io.IOException;

/**

 * 守护线程在没有用户线程可服务时自动离开

 */

public class TestMain4 extends Thread {

   

    public TestMain4() {

    }

    public void run() {

        for(int i = 1; i <= 50; i++){

            try {

                Thread.sleep(100);

            } catch (InterruptedException ex) {

                ex.printStackTrace();

            }

            System.out.println(i);

        }

    }

   

    public static void main(String [] args){

        TestMain4 test = new TestMain4();

        test.setDaemon(false);

        test.start();

        System.out.println("isDaemon = " + test.isDaemon());

        try {

            System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束,如果test不是守护进程必须等到test运行完了以后才退出

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

}

----------------------------------------------------------------------------------

例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

 

3、下面是一个论坛的帖子

 

http://topic.csdn.net/t/20060115/00/4517316.html

 

守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)  
    
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。

分享到:
评论

相关推荐

    浅谈java的守护线程与非守护线程

    主要介绍了浅谈java的守护线程与非守护线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java的守护线程+log4日志记录

    很多人对java的线程不是很了解,甚至连守护线程都么有听过,其实很简单,守护线程就是普通的线程,区别再于,他就是类似一个秘书一样,记录着所有的非守护线程的信息等等,守护线程,是指为工作线程做相关统计、汇总...

    【java 多线程】守护线程与非守护线程的详解

    主要介绍了java守护线程与非守护线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    python实现守护进程、守护线程、守护非守护并行

    本篇文章主要介绍了python实现守护进程、守护线程、守护非守护并行,详细的介绍了守护子进程、非守护子进程并存,守护子线程非守护子进程并存的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java多线程编程指南

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,...一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...

    动力节点_Java基础视频教程218_线程-守护线程

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常...适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础更扎实的小伙伴。

    yibingxiong#java-concurrent-programming-art-mini#03-线程的一些属性1

    非守护线程创建的线程默认为非守护线程,守护则默认为守护线程优先级(priority)优先级高的线程可以得到更多cpu资源, 级别是1-10,默认优先级和创建他的

    python多线程使用方法实例详解

    本文实例讲述了python多线程使用方法。分享给大家供大家参考,具体如下: ...整个 Python 程序将在所有非守护线程退出之后才退出, 换句话说, 就是没有剩下存活的非守护线程时才退出。 使用thread模块 以下是

    一篇文章让你深入理解线程、多线程、进程、多进程

    一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程  又称其为轻量级进程(Light Weight Process)。是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际...

    【python内功修炼006】:基于threading模块的多线程操作(详解)

    threading模块主要对象三、threading.Thread对象1、语法2、参数3、常用方法四、python开启线程的两种方法1、使用threading.Thread 线程对象2、...介绍2、代码实例六、守护线程和非守护线程1、守护线程介绍2、守护进程实例...

    Python中Threading用法详解

    Python的threading模块松散地基于Java的threading模块。但现在线程没有优先级,没有线程组,不能被销毁、停止、...在非守护进程中使用Event。 Thread 类 (group=None, target=None, name=None, args=(), kwargs={}, *

    python并发编程之多线程

    multiprocess模块的...对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕详细解释:#1主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程

    JAVA多线程技术分享-39页PPT(winding)

    4,守护线程 二 锁: 1,乐观锁 悲观锁 2,自旋锁 适应性自旋锁 3,synchronized 锁升级 4,公平锁 非公平锁 5,可重入锁 非可重入锁 三: 线程通信 1,wait notify 2,volatile 3,lock 4,join 5,并发工具 ...

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 ...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    只要当前JVM实例中存在任何一个非守护线程在没有结束,守护线程就在工作.守护线程的作用就是为其他的非守护线程提供便利服务 第二章:对象及变量的并发访问 只有共享的资源读写才需要同步化 方法中的变量不存在非线程...

    Java 7并发编程实战手册

    1.8 守护线程的创建和运行 20 1.9 线程中不可控异常的处理 24 1.10 线程局部变量的使用 26 1.11 线程的分组 30 1.12 线程组中不可控异常的处理 34 1.13 使用工厂类创建线程 37 第2章 线程同步...

    linux从零基础系统编程开始视频教程.zip

    目录网盘文件永久链接 Day1(命令基础,软件安装与卸载) Day2 (vim、动静态库) Day3 (makefile、、gdb调试工具、open函数) ...Day9 (守护进程、线程、线程控制、线程属性) Day10 (线程同步、信号量、条件变量)

Global site tag (gtag.js) - Google Analytics