美文网首页
守护线程与非守护线程

守护线程与非守护线程

作者: 三年级一班亚索 | 来源:发表于2018-11-07 12:09 被阅读21次

参考:
守护线程与非守护线程 > https://www.cnblogs.com/lixuan1998/p/6937986.html

概念

进程中会同时存在二种线程:也就是守护线程和非守护线程,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。但是必须在thread.start()之前设置,否则就会抛出一个IllegalThreadStateException异常,不能把正在运行的常规线程设置为守护线程。

实例

我们看以下例子:

// MyTask.java
import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask
{
  @Override
  public void run() {
    System.out.println("begain time:"+new Date());
  }
}
// Test.java
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Test {
public static void main(String[] args){
    System.out.println("now:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    Timer timer=new Timer();
    //后一个参数是任务的执行时间
    timer.schedule(task,date);
   }
}

我们执行这个程序可以发现,任务虽然运行完了,但进程还未销毁,呈红色状态,为什么会出现这种情况呢?因为Timer就是启动一个新的线程,而且启动的线程不是守护线程,所以一直运行。

运行结果

接着,我们按ctrl+c停止当前程序,然后更改一下Test.java里面的代码,在Timer的构造函数中传入true,也就是把从Timer里面开启的线程设置成守护线程。

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test1 {
public static void main(String[] args){
    System.out.println("now:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    // 在Timer的构造函数中传入true
    Timer timer=new Timer(true);
    timer.schedule(task,date);
 }
}

因为主线程执行完毕以后,就没有需要被守护的线程了,所以,即使我们安排了任务,也会因为主线程的退出而不会被执行。


运行结果如下

到这里想必已经能够理解什么是守护线程和非守护线程了,不过,我还想补充一下,就是,在守护线程中创建出的线程,也是守护线程,具体的,大家可以自己写一个程序作测试。

相关文章

  • 线程知识点复习(一)

    守护线程与非守护线程: java中有两条线程:1.守护线程,2.非守护线程(用户线程)守护线程与main主线程同时...

  • 2018-09-19 守护线程与非守护线程

    什么是守护线程、非守护线程? 什么是守护线程,和main有关。 用户线程(非守护线程): 守护线程,有一个特征,和...

  • 并发编程和JVM调优

    并发编程三要素 原子性 有序性 可见性 守护线程和非守护线程 非守护线程运行结束,jvm退出,与守护线程是否存在无...

  • 问题:什么是守护线程,使用场景是什么,如何创建守护线程

    问题 什么是守护线程?使用场景是什么?如何创建守护线程? 答案 守护线程 守护线程通常执行一些任务,当所有非守护线...

  • 守护线程与非守护线程

    参考:守护线程与非守护线程 > https://www.cnblogs.com/lixuan1998/p/6937...

  • Java多线程之<<守护线程>>实战

    定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护...

  • Java守护线程

    Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。 守护线程是所有非守护线程的保姆,当...

  • 并发类面试题

    1.java线程中的守护线程和用户线程概述 只要当JVM实例中尚存任何一个非守护线程没有结束,守护线程...

  • 什么是守护线程

    守护线程定义与守护线程相对应就是用户线程,用户线程可以理解为系统工作的线程,而守护线程守护的就是用户线程。当用户线...

  • 守护线程

    在java线程中有两种线程,一种是用户线程,另一种是守护线程。 守护线程是一种特殊的线程,当进程中不存在非守护线程...

网友评论

      本文标题:守护线程与非守护线程

      本文链接:https://www.haomeiwen.com/subject/yxnmxqtx.html