`
snoopy7713
  • 浏览: 1148999 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

Java并发编程:守护线程

    博客分类:
  • java
阅读更多

所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。下面,让我们来继续深入了解守护线程。

 

 

在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。

所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:

(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

(2) 在Daemon线程中产生的新线程也是Daemon的。

(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

 

import java.util.concurrent.TimeUnit;

/**
 *  守护线程
 */
public class Daemons {
 
    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread d = new Thread(new Daemon());
        d.setDaemon(true); //必须在启动线程前调用
        d.start();
        System.out.println("d.isDaemon() = " + d.isDaemon() + ".");
        TimeUnit.SECONDS.sleep(1);
}
}

class DaemonSpawn implements Runnable {
    public void run() {
        while (true) {
            Thread.yield();
        }
    }
}

class Daemon implements Runnable {
    private Thread[] t = new Thread[10];
    public void run() {
        for (int i=0; i<t.length; i++) {
            t[i] = new Thread(new DaemonSpawn());
            t[i].start();
            System.out.println("DaemonSpawn " + i + " started.");
        }
        for (int i=0; i<t.length; i++) {
            System.out.println("t[" + i + "].isDaemon() = " +
                    t[i].isDaemon() + ".");
        }
        while (true) {
            Thread.yield();
        }
    }  
}

 运行结果

写道
运行结果:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.
t[0].isDaemon() = true.
t[1].isDaemon() = true.
t[2].isDaemon() = true.
t[3].isDaemon() = true.
t[4].isDaemon() = true.
t[5].isDaemon() = true.
t[6].isDaemon() = true.
t[7].isDaemon() = true.
t[8].isDaemon() = true.
t[9].isDaemon() = true.

 

以上结果说明了守护线程 中产生的新线程也是守护线程。

如果将 mian 函数中的 TimeUnit. SECONDS .sleep(1); 注释掉,运行结果如下:

写道
d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.

 

以上结果说明了 如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。下面的例子也说明了这个问题。

代码示例:

 

import java.util.concurrent.TimeUnit;

/**
 * Finally shoud be always run ?
 */
public class DaemonsDontRunFinally {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread t = new Thread(new ADaemon());
        t.setDaemon(true);
        t.start();
    }
}

class ADaemon implements Runnable {
    public void run() {
        try {
            System.out.println("start ADaemon...");
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            System.out.println("Exiting via InterruptedException");
        } finally {
            System.out.println("This shoud be always run ?");
        }
    }
}

 

写道
运行结果:

start ADaemon...
如果将main函数中的t.setDaemon(true);注释掉,运行结果如下:
start ADaemon...
This shoud be always run ?

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java并发编程:线程基础

    Java并发编程中的线程基础是理解多线程编程的关键,它涵盖了从线程的创建到管理,再到线程间通信的全过程。多线程编程在处理高性能和高响应性的应用程序时至关重要,因为它允许程序在单个进程中同时执行多个任务,...

    Java并发编程:设计原则与模式(第二版)-3PDF

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的权威著作。这本书旨在帮助开发者理解和掌握如何有效地编写可扩展且高效的并发程序。以下是书中涵盖的一些关键知识点: 1....

    Java并发编程:设计原则与模式(Concurrent.Programming.in.Java)(中英版)

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的权威书籍,由Doug Lea撰写,第二版全面涵盖了Java并发处理的各个方面。这本书不仅提供了丰富的理论知识,还介绍了实战中的设计原则和模式,对于Java...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    java 并发编程的艺术pdf清晰完整版 源码

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    Java多线程编程总结

    Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 ...

    《Java并发编程艺术》高清带目录中文版

    《Java并发编程艺术》是一本深入探讨Java平台上的并发编程技术的专业书籍。这本书全面覆盖了Java并发编程的基础知识、核心概念以及高级技巧,旨在帮助读者理解如何在多线程环境中编写高效、安全的代码。 并发编程是...

    Java并发编程示例(七):守护线程的创建和运行

    在上述的并发编程示例中,我们创建了两个线程:一个普通线程`WriterTask`和一个守护线程`CleanerTask`,用于处理事件队列`Deque&lt;Event&gt;`。 `WriterTask`实现了`Runnable`接口,负责向队列中写入事件。它有一个内部...

    Java并发编程实践

    《Java并发编程实践》这本书深入探讨了Java平台上的并发编程技术,涵盖了从基础概念到高级策略的广泛主题。在Java编程中,并发处理是优化性能、提高系统资源利用率的关键手段,尤其是在多核处理器和分布式系统中更为...

    《Java 并发编程实战》.zip

    《Java 并发编程实战》是一本专注于Java并发编程领域的权威书籍,旨在帮助开发者深入理解和掌握在多线程环境中编写高效、安全且可维护的代码。这本书涵盖了Java并发编程的基础概念,高级特性以及最佳实践,是Java...

    Java并发编程艺术

    《Java并发编程艺术》这本书是Java开发者深入理解并发编程的重要参考。并发编程是现代多核处理器环境下不可或缺的技术,它能够充分利用系统资源,提高程序的执行效率。以下将详细阐述Java并发编程的一些核心知识点:...

    Java并发编程最全面试题 123道

    16. 守护线程:理解守护线程的概念,以及如何设置和使用。 五、并发编程中的挑战 17. 死锁:分析死锁产生的条件和解决策略。 18. 活锁和饥饿:理解这两类并发问题,以及避免方法。 19. 资源竞争:了解如何避免和...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    Java并发编程-线程安全与基础构建模块

    本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定性。 首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论...

    Java并发编程线程入门简介.pdf

    10. **并发模式**:Java并发编程还包括多种设计模式,如生产者消费者模型、读写锁模式、守护线程模式等,这些模式可以帮助开发者设计出高效且健壮的并发程序。 以上就是Java并发编程线程的基础知识,理解并熟练掌握...

    深入学习:Java多线程编程

    6. **线程优先级与守护线程**:线程的优先级可以影响其调度顺序,而守护线程则是在所有用户线程结束后才会停止运行的线程,如垃圾收集器。 7. **异常处理**:多线程环境下,如何正确处理和传播异常是另一个重要话题...

    java 并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。《Java并发编程实践》(Addison.Wesley.Java.Concurrency.in.Practice.May.2006.chm)...

    JAVA并发编程 E 文

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发能力可以极大地提高软件性能和响应速度。这本书籍"JAVA并发编程 E 文"以CHM(Compiled HTML Help)格式提供,方便读者以电子...

    java虚拟机并发编程.pdf

    5. **并发工具类**:ExecutorService、Future和Callable接口是Java并发编程的重要组成部分,它们提供了线程池管理和异步任务执行的能力。 6. **并发模式**:书中会讨论一些经典的并发模式,如生产者消费者模型、...

    大厂学院高阶班java并发编程面试视频资料(6.95G)

    大厂学院高阶班java并发编程面试视频资料(6.95G) 〖课程介绍〗: 大厂学院高阶班java并发编程面试视频资料(6.95G) 〖课程目录〗: 01_前言.mp4 44.96M 02_线程的start方法.mp4 68.78M 03_进程线程管程.mp4 54.58M ...

Global site tag (gtag.js) - Google Analytics