Java守护线程与用户线程示例代码

  • 更新时间:2020-03-14 17:48:23
  • 编辑:吕书文
我们帮大家精选了Java相关的编程文章,网友尚静曼根据主题投稿了本篇教程内容,涉及到Java、用户线程、守护线程、详解Java线程-守护线程与用户线程相关内容,已被122网友关注,内容中涉及的知识点可以在下方直接下载获取。
  • 《机器学习算法框架实战:Java和Python实现》配书资源 / 5.32 MB 推荐度:
  • Web编程基础:CSS、JavaScript、jQuery / 35 MB 推荐度:
  • 零点起飞学Java / 8.24MB 推荐度:
  • Java高并发编程详解:多线程与架构设计 / 120.77 MB 推荐度:
  • Java8编程入门官方教程 / 233 MB 推荐度:
  • 详解Java线程-守护线程与用户线程

    干java 开发这么多年, 之前一直没留意java 进程还区分守护进程和用户进程。守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来java也有守护线程的概念。

    1. Java 线程

    1.1 守护线程与用户线程

    Java 线程分为守护线程(DaemonThread) 和 用户线程(UserThread)两类.

    1. 通常情况下,我们使用Thread 创建的线程在默认情况下都属于用户线程, 当在启动线程之前, 执行thread.setDaemon(true)时, 线程会变成守护线程。
    2. 其实在本质上,用户线程和守护线程并没有太大区别,唯一的区别就是会影响虚拟机的退出(程序的终止)。当jvm中只剩下守护线程时,虚拟机会退出,及程序终止;而当jvm中至少拥有一个用户线程时,jvm都不会退出。

    1.2 守护线程特点

    Java 中的守护线程和linux 中的守护进程还是有些区别的, linux 守护进程时系统级别的, 当系统退出时, 才会终止. 而java 中的守护线程时jvm 级别的, 当jvm中无任何用户进程时, 守护进程销毁, jvm 退出, 程序终止. 笔者认为java 守护进程的最主要的特点有:

    1. 守护进程是运行在程序后台的线程
    2. 守护进程创建的进程,依然时守护进程
    3. 守护进程不会影响jvm的退出,当jvm只剩余守护进程时,jvm 进行退出
    4. 守护进行在jvm退出时,自动销毁

    在开发java 守护线程时, 需要注意:

    1. 在线程启动之前, 及执行thread.start() 方法前, 设置thread.setDemon(true);
    2. 在守护线程中启动的子线程也是守护线程
    3. 守护线程不建议进行写操作, 因为守护进程随时可能结束。

    1.3 守护线程适用场景

    针对于守护线程的特点,笔者认为,java 守护线程通常可用于开发一些为其它用户线程服务的功能。比如说心跳检测,事件监听等。Java 中最有名的守护进程当属GC(垃圾回收)

    2. java 守护线程开发

    开发守护进程时需要注意两点:

    1. 必须在线程启动之前,即执行thread.start()方法前, 执行thread.setDaemon(true) 方法,否则会抛出异常IllegalThreadStateException
    2. 守护线程中创建的线程也是守护线程

    2.1 测试程序退出

    1. 注释thread.setDaemon(true)时, 线程为用户线程, 程序进行无线循环, 程序不终止。
    2. 设置thread.setDaemon(true)后, 线程变成守护线程, 程序直接终止, 仅输出一行信息"main thread done"。 因为程序执行完system 语句之后, main 程序作为唯一的一个用户线程执行结束了, jvm 中只剩下一个守护进程,所以jvm 便退出了。
    public class TestThread {
    
     public static void main(String[] args) {
    
      AnsyTask ansyTask = new AnsyTask();
    
      Thread thread = new Thread(ansyTask);
    
      // 设置线程为异步线程
      // thread.setDaemon(true);
    
      // 启动线程
      thread.start();
      
      System.out.println("main thread done");
     }
    }
    
    class AnsyTask implements Runnable{
    
     @Override
     public void run() {
      while (true){
       System.out.println(LocalDateTime.now() + "-hello,thread");
      }
     }
    }
    

    2.2 测试守护线程中创建新的线程

    测试会发现, 默认情况下, 守护线程创建的子线程依然是守护线程,用户创建的守护线程依然时用户线程。也可以在创建子线程时通过setDaemon()方法修改.

    public class TestThread {
    
     public static void main(String[] args) throws InterruptedException {
    
      AnsyTask ansyTask = new AnsyTask();
    
      Thread thread = new Thread(ansyTask);
    
      // 设置线程为异步线程
      thread.setDaemon(true);
    
      // 启动线程
      thread.start();
    
      // 给守护线程点儿执行时间
      Thread.sleep(1000l);
     }
    }
    
    class AnsyTask implements Runnable{
    
     @Override
     public void run() {
      Thread thread = new Thread("subThread");
      System.out.println(thread.getName() + " is daemon:" + thread.isDaemon());
     }
    }
    

    以上所述是小编给大家介绍的Java守护线程与用户线程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

    Java相关教程

    • 2020年学习Java需要学历吗

      对于零基础可以学好Java,很多朋友已经坚信这点,也不再担心自己是零基础会不会学不好Java这个问题了,但是又有另一个担心,学历,学Java有什么样的学历要求没有?这又成为很多朋友比较担心的问题,学Java跟学历有什么样的关系呢?一起跟小编往下看吧。

      发布时间:2021-06-06

    • 初学者如何学好Java编程入门

      Java语言已经成为重要的网络编程语言,毕竟现在安卓占有率非常得高,无论任何培训机构Java都是必备的课程,那么Java怎么学习呢?

      发布时间:2021-06-06

    用户留言