精华内容
下载资源
问答
  • setDaemon

    2016-08-29 19:56:13
    Thread.setDaemon设置说明   Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程 ...
    
    
    Thread.setDaemon的用法,经过学习以后了解:

    1. setDaemon需要在start方法调用之前使用

    2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程

    3. 如果jvm中都是后台进程,当前jvm将exit。(随之而来的,所有的一切烟消云散,包括后台线程啦)

    4. 主线程结束后,

    1) 用户线程将会继续运行

    2) 如果没有用户线程,都是后台进程的话,那么jvm结束

    另外:

    setDaemon方法把java的线程设置为守护线程,此方法的调用必须在线程启动之前执行。只有在当前jvm中所有的线程都为守护线程时,jvm才会退出。
    如果创建的线程没有显示调用此方法,这默认为用户线程。

    实例如下:

    package com.jack.mySample;

    import java.io.IOException;

    public class TestThread extends Thread {

    public TestThread() {
    }
    /** *//**
    * 线程的run方法,它将和其他线程同时运行
    */
    public void run(){
    for(int i = 1; i <= 100; i++){
    try{
    Thread.sleep(100);

    } catch (InterruptedException ex){
    ex.printStackTrace();
    }
    System.out.println(i);
    }
    }
    public static void main(String [] args){
    TestThread test = new TestThread();
    // 如果不设置daemon,那么线程将输出100后才结束
    test.setDaemon(true);
    test.start();
    System.out.println("isDaemon = " + test.isDaemon());
    try {
    System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    }

    补充说明:

    定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。

    优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

    设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为

    守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。

    example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的

    Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是

    JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于

    实时监控和管理系统中的可回收资源。

    生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且

    周期性地执行某种任务或等待处理某些发生的事件。也就是

    说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是

    什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个

    或以上的非守护线程则JVM不会退出。



    初次碰到这个方法,就被这个怪里怪气的拼写单词懵了下,查API又觉得理解得不深刻,那还是查下Daemon这个词有什么意思,什么词源吧。Daemon 中的 ae 为一个音,重音在 /di:/ 上,好象是指希腊守护神的意思吧。在计算机专业英语中是守护线程的意思。原以为如果一个线程被光荣地定义为守护线程,一定会直到进程运行到最后一刻,但真错了,如果一个线程是守护线程,那么,主线程运行结束时,如果没有任何非守护线程在运行,守护线程就会自尽了。 setDaemon方法是Thread中的方法,默认为false状态,将该线程标记为守护线程或用户线程,该方法必须在启动线程前调用,具有最低的优先级,让系统资源优先调用其他线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。


    如下边这个小程序如示:

    import java.io.IOException;

    class TestMain4 extends Thread {
    public void run() {//永真循环线程
    for(int i=0;;i++){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException ex) { }
    System.out.println(i);
    }
    }

    public static void main(String [] args){
    TestMain4 test = new TestMain4();
    test.setDaemon(true);//调试时可以设置为false,那么这个程序是个死循环,没有退出条件。设置为true,即可主线程结束,test线程也结束。
    test.start();
    System.out.println("isDaemon = " + test.isDaemon());
    try {
    System.in.read();// 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
    } catch (IOException ex) {}
    }

    展开全文
  • setDaemon方法

    千次阅读 2019-08-23 16:11:25
    启动线程前设置thread.setDaemon(True) 即 设置该线程为守护线程, 表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。 这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的...
    '''
    启动线程前设置thread.setDaemon(True) 即 设置该线程为守护线程,
    表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
    这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。
    '''
    
    import threading
    from time import ctime, sleep
    
    
    def listenMusic(name):
        print("Begin listening to %s ------%s" % (name, ctime()))
        sleep(3)
        print("Stop listening ------%s" % ctime())
        
    def readBook(title):
        print("Begin reading a %s ------%s" % (title, ctime()))
        sleep(5)
        print('Stop reading ------%s' % ctime())
    
    threads = []
    t1 = threading.Thread(target=listenMusic, args=('music',))
    t2 = threading.Thread(target=readBook, args=('book',))
    
    threads.append(t1)
    threads.append(t2)
    
    if __name__ == '__main__':
        # 效果 == 下一步for循环中t.setDaemon(True)
        # t1.setDaemon(True)
        # t2.setDaemon(True)
    
        for t in threads:                               # 对列表进行遍历
            t.setDaemon(True)                           # 注意:一定在start之前设置
    
            t.start()                                   # 启动线程活动
    
            print(t.getName())                          # 返回线程名
            print("count:", threading.active_count())   # 返回正在运行的线程数量
    
            # t.join()									# 串行
    
        t1.join()                                       # 等待t1
        # t1.setDaemon(True)                            # 报错
    
        print("All Over -------%s" % ctime())
    
    展开全文
  • setDaemon详解

    万次阅读 2019-04-06 15:07:12
    JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个IllegalThreadStateException异常。不能操作文件、...

    一、线程
    JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个IllegalThreadStateException异常。不能操作文件、数据库等资源,避免主线程关闭而未能关闭守护线程的资源,并且它会在任何时候甚至在一个操作的中间发生中断。
    二、优点及使用场景
    在主线程关闭后无需手动关闭守护线程,因为会自动关闭,避免了麻烦,Java垃圾回收线程就是一个典型的守护线程,简单粗暴的可以理解为所有为线程服务而不涉及资源的线程都能设置为守护线程。
    作者:梦里藍天
    来源:CSDN
    原文:https://blog.csdn.net/ren365880/article/details/80289532
    举个例子:

    public class Demo {
        public static void main(String[] args) {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("----睡眠一秒-----");
                }
            });
            //默认为false,设置为false代表非守护线程,true为守护线程,守护线程在主方法结束时候结束
    //        thread.setDaemon(true);
            thread.start();
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("主线程over");
        }
    }
    

    thread.setDaemon(false);这个方法默认为false,当为false情况下,输出:
    在这里插入图片描述
    主方法执行完成并不会结束.
    thread.setDaemon(true);当为守护线程的时候,主方法结束,守护线程就会结束.
    在这里插入图片描述
    很好理解,具体使用的话,要自己看看了

    展开全文
  • 守护线程setDaemon

    2019-09-29 19:36:23
    setDaemon(true) package cn.itcast_04; /* * public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。 * 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用...

    主线加守护线程,主线程挂掉守护线程挂掉

    setDaemon(true)
    
    package cn.itcast_04;
    
    /*
     * public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
     * 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。 
     * 
     * 游戏:坦克大战。
     */
    public class ThreadDaemonDemo {
    	public static void main(String[] args) {
    		ThreadDaemon td1 = new ThreadDaemon();
    		ThreadDaemon td2 = new ThreadDaemon();
    
    		td1.setName("关羽");
    		td2.setName("张飞");
    
    		// 设置收获线程
    		td1.setDaemon(true);
    		td2.setDaemon(true);
    
    		td1.start();
    		td2.start();
    
    		Thread.currentThread().setName("刘备");
    		for (int x = 0; x < 5; x++) {
    			System.out.println(Thread.currentThread().getName() + ":" + x);
    		}
    	}
    }
    
    
    展开全文
  • python setDaemon

    2015-07-22 17:11:00
    python中得thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子... python对于thread的管理中有两个函数:join和setDaemon join:如在一个线程B中调用threada.join(),则threada结束后,线程B才会接着thr...
  • 主要介绍了python使用Thread的setDaemon启动后台线程教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 多线程 之 setDaemon

    2017-10-15 15:13:44
    setDaemon 守护线程
  • setDaemon和join区别

    2019-08-10 22:18:48
    在科普什么是setDaemon和join之前,首先得明白进程与线程的概念。简而言之:代码在运行时,在内存中开辟了一个空间来运行这个代码块,在电脑的任务管理器可以进行查看,而这个代码在运行的时候,可能不止一个主线程...
  • setDaemon 守护线程

    2018-05-29 20:06:00
    setDaemon(True): 将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。 当我们 在程序运行中,执行一个主线程,如果主线程又创建一...
  • 主要介绍了浅谈Python中threading join和setDaemon用法及区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Thread.setDaemon详解

    2019-09-24 12:07:17
    通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。 用户线程和守护线程的区别: 1. 主线程结束后用户线程还会继续运行,JVM存活;...
  • join和setDaemon

    2017-01-23 15:32:00
    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。 1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,...
  • setdaemon 方法 线程类最终void setDaemon(boolean thread_status) (Thread Class final void setDaemon(boolean thread_status)) This method is available in package java.lang.Thread.setDaemon(Boolean thread_...
  • Thread.setDaemon设置说明

    2019-08-09 17:45:56
    Thread.setDaemon的用法,经过学习以后了解: setDaemon需要在start方法调用之前使用 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程 如果jvm中都是后台进程,当前jvm将exit。(随之而...
  • setDaemon th.setDaemon(True) 默认参数为 False setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。当没有存活的非守护进程时,整个python程序才会...
  • Thread.setDaemon说明

    2016-09-06 20:23:23
    Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程 3. 如果jvm中都是后台进程,当前jvm将exit。(随...
  • Python线程join和setDaemon

    2020-12-15 16:05:04
    看一下线程的setDaemon()方法 import time import threading import ctypes import inspect def sayHello(): for i in range(10): print("hello") time.sleep(1) def _async_raise(tid, exctype): """raises ...
  • 守护线程 setDaemon

    2011-02-10 13:09:00
    守护线程 setDaemon
  • Thread.setDaemon

    2012-10-01 18:44:14
    忽然在某段程序中看到了Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程 3. 如果jvm中都是后台...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,493
精华内容 16,197
关键字:

setdaemon