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

Java多线程:守护线程与非守护线程的详解

什么是守护线程?

在Java多线程中,守护线程是一种在后台运行的线程,它不会阻止程序的结束,也不会执行任何没有被其他非守护线程阻止的操作。

换句话说,当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。

如何创建守护线程?

可以通过Thread类的setDaemon()方法来创建守护线程,示例如下:

Thread daemonThread = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            System.out.println("I'm a daemon thread!");
        }
    }
});
daemonThread.setDaemon(true);
daemonThread.start();

在上述代码中,创建了一个无限循环的守护线程,当程序中最后一个非守护线程结束时,守护线程也将停止运行。

如何创建非守护线程?

非守护线程是线程默认创建的类型。如果一个线程没有被设置为守护线程,那么它就是非守护线程。

示例如下:

Thread nonDaemonThread = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            System.out.println("I'm a non-daemon thread!");
        }
    }
});
nonDaemonThread.start();

在上述代码中,创建了一个无限循环的非守护线程。

守护线程和非守护线程的区别

主要区别在于程序结束时守护线程和非守护线程的行为不同。

当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。而非守护线程执行完它的任务后,程序才会退出。

此外,守护线程还有一个特点,它不会阻止JVM的正常关闭。

示例说明1:使用守护线程实现自动保存功能

public class AutoSaveThread extends Thread {

    private boolean changed = false;

    public void setChanged() {
        this.changed = true;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (changed) {
                System.out.println("自动保存");
                changed = false;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        AutoSaveThread autoSaveThread = new AutoSaveThread();
        autoSaveThread.setDaemon(true);
        autoSaveThread.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("Main thread working...");
            Thread.sleep(1000);
            autoSaveThread.setChanged();
        }
    }
}

在上述代码中,创建了一个存储是否发生变更的布尔值变量changed的AutoSaveThread守护线程。在运行时,守护线程每秒检查一次是否有发生变更,有变更则自动保存。在主线程中执行5次循环时,每次循环后都将changed设为true,以用于守护线程的条件判断。

运行该程序时,即使主线程已经结束,但守护线程会一直运行下去。

示例说明2:使用非守护线程下载文件

public class DownloadThread implements Runnable {

    private String url;
    private String fileName;

    public DownloadThread(String url, String fileName) {
        this.url = url;
        this.fileName = fileName;
    }

    @Override
    public void run() {
        try {
            URL downLoadUrl = new URL(url);
            URLConnection conn = downLoadUrl.openConnection();
            InputStream is = conn.getInputStream();

            FileOutputStream fos = new FileOutputStream(fileName);
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            fos.close();
            is.close();

            System.out.println(fileName + " 下载完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Thread(new DownloadThread("http://cdn.npm.taobao.org/dist/node/v10.15.1/node-v10.15.1.pkg", "node-v10.15.1.pkg")).start();
        new Thread(new DownloadThread("http://sw.bos.baidu.com/sw-search-sp/software/8c18ae9d1d1e7/SogouInput_mac_10.1.0.1338.dmg", "SogouInput_mac_10.1.0.1338.dmg")).start();
    }
}

在上述代码中,创建了一个非守护线程DownloadThread来实现下载文件。在main方法中,同时执行了两个DownloadThread实例,在两个线程中分别下载了node.js和搜狗输入法的安装包。

在下载完成后,程序仍然不会退出,因为这里使用的是非守护线程。

总结

通过本文,我们详细讲解了Java多线程中守护线程和非守护线程的概念和用法,并给出了多个示例。掌握了守护线程和非守护线程的使用方法,可以帮助我们更好的进行多线程编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【java 多线程】守护线程与非守护线程的详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 简单谈谈Java 中的线程的几种状态

    当Java程序启动时,JVM会为主线程分配一个特殊的栈来执行代码。同时,程序可以创建若干个子线程以支持并发执行相应的任务。线程在执行过程中,可以出现以下几种状态: 新建状态(New) 当线程对象创建以后,该线程处于新建状态。此时线程对象已经在内存中了,但是还没有分配系统资源,没有被CPU选中去执行,也没有开始执行线程中的代码。因此,新建状态的线程在内存中的状…

    多线程 2023年5月16日
    00
  • golang并发ping主机的方法

    首先我们需要了解一下”并发ping主机的方法”的概念。 将多个ping请求并发地发送给多个主机,可以达到加快检测速度,提高并发性能的目的。在golang中,可以使用goroutine和channel等机制来实现并发ping主机的方法。 以下是一份完整的攻略: 1. 准备工作 准备一个可以进行ping测试的服务器,并确保目标主机有响应。 在golang中,需要…

    多线程 2023年5月17日
    00
  • 4G内存服务器epoll并发量最大能达到多少?

    为了回答这个问题,我们需要一些背景知识。首先,我们需要知道什么是4G内存服务器,以及什么是epoll并发量。然后,我们还需要了解一些相关概念,例如TCP/IP协议,Linux内核等。 4G内存服务器是指内存大小为4GB的服务器。这种服务器通常用于轻量级的应用程序和小型网站。对于大型应用程序和高流量网站,需要更大的内存以及更强大的处理能力。 Epoll是Lin…

    多线程 2023年5月16日
    00
  • Python中多线程的创建及基本调用方法

    Python中的多线程是一种实现并发执行的机制,可以提高程序的性能和效率。以下是Python中多线程的创建及基本调用方法的详细攻略。 创建线程 Python中创建线程有两种方法,分别是继承Thread类和直接创建Thread实例。 继承Thread类 使用这种方法,只需要继承Thread类,并重写它的run()方法,即可创建一个线程。示例代码如下: from…

    多线程 2023年5月17日
    00
  • Python中的并发处理之asyncio包使用的详解

    Python中的并发处理之asyncio包使用的详解 什么是asyncio asyncio是Python3.4版本引入的一种标准库,用于支持异步IO编程。asyncio实现了TCP、UDP、SSL等协议,可以方便地实现异步I/O操作,适用于高并发IO密集型应用程序。 asyncio使用协程技术实现异步编程,相比于多线程、线程池等方式,它具有协程的优点,可以避…

    多线程 2023年5月16日
    00
  • 利用js实现Ajax并发请求限制请求数量的示例代码

    下面是详细的攻略: 概述 在一些需要频繁向服务器发送请求的场景下,如果没有限制同时发送的请求数量,可能会导致请求堆积,甚至因为资源不足而出现网页崩溃等问题。为了避免这种情况的发生,我们可以利用 JavaScript 实现 Ajax 并发请求限制请求数量的功能。 实现步骤 创建一个请求数量的计数器,初始化为 0; 定义一个请求队列,用来存储待发送的 Ajax …

    多线程 2023年5月17日
    00
  • 深入理解Python 多线程

    深入理解Python 多线程:完整攻略 前言 随着互联网时代的到来,Python成为一款备受欢迎的编程语言。然而,在Python中,多线程技术十分重要。在许多涉及到I/O密集型操作的场景中,多线程的技术可以对性能提升有很大的帮助。在本篇文章中,我们将探讨如何深入理解Python多线程的工作原理。 Python多线程简介 在Python中,我们可以使用内置的’…

    多线程 2023年5月17日
    00
  • Java编程思想中关于并发的总结

    Java编程思想中关于并发的总结 Java编程思想这本书的第二十一章讲解了关于并发的内容,本文就对其总结一下。 并发基础 Java中的线程数据结构是非常简单的,Java的线程是一种操作系统线程,Java线程维护着自己的堆栈、程序计数器和一套寄存器。 线程的主要状态有五个,分别是新建、就绪、运行、阻塞和死亡。其中“就绪”状态指线程已经准备好获取CPU,并等待C…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部