`
oywl2008
  • 浏览: 1001804 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA并发编程——守护线程(Daemon Thread)

 
阅读更多

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

代码示例:

 

import java.util.concurrent.TimeUnit;

 

 

 

/**

 

 * 守护线程

 

 */

 

publicclass Daemons {

 

 

 

    /**

 

     *@paramargs

 

     *@throwsInterruptedException

 

     */

 

    publicstaticvoid 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 {

 

 

 

    publicvoid run() {

 

        while (true) {

 

            Thread.yield();

 

        }

 

    }

 

   

 

}

 

 

 

class Daemon implements Runnable {

 

    private Thread[] t = new Thread[10];

 

 

 

    publicvoid 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 ?

 

 */

 

publicclass DaemonsDontRunFinally {

 

 

 

    /**

 

     *@paramargs

 

     */

 

    publicstaticvoid main(String[] args) {

 

        Thread t = new Thread(new ADaemon());

 

        t.setDaemon(true);

 

        t.start();

 

    }

 

 

 

}

 

 

 

class ADaemon implements Runnable {

 

 

 

    publicvoid 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 ?

 

http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html

 

分享到:
评论

相关推荐

    java daemon 守护线程实例

    java daemon 程序,有助于理解守护线程的概念和使用

    Java 守护线程,看这篇文章就对了! ( Daemon Thread )

    Java 的守护线程什么是Java的守护线程( Daemon Thread )?守护线程的区别?守护线程的作用?守护线程如何创建?守护线程如何判断?守护线程使用的注意事项总结 什么是Java的守护线程( Daemon Thread )? Java 提供...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段12讲、Daemon线程的创建以及使用场景分析.mp4 │ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高...

    精灵线程(Daemon)或守护线程---马克-to-win java视频

    精灵线程(Daemon)或守护线程---马克-to-win java视频

    Java线程之守护线程(Daemon)用法实例

    主要介绍了Java线程之守护线程(Daemon)用法,较为详细的分析了守护线程的功能与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Java多线程守护线程

     在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)  作用  Daemon的作用是为其他线程的运行提供便利服务,守护线程典型的应用是 GC (垃圾回收器),它是一个很称职的守护者。  区别  ...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段12讲、Daemon线程的创建以及使用场景分析.mp4 │ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高...

    JAVA最新面试资料-备战2023金三银四

    java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。任 何线程都可以设置为守护线程和用户线程,通过方法 Thread.setDaemon(boolon);true 则把该线程设置为守护线程,反之则为用户线程。 Thread....

    Java守护线程实例详解_动力节点Java学院整理

    在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。下面通过本文给大家分享java守护线程实例详解,需要的朋友参考下吧

    java中的daemon thread

    java中的daemon thread java中有两种类型的thread,user threads 和 daemon threads。 User threads是高优先级的thread,JVM将会等待所有的User Threads运行完毕之后才会结束运行。 daemon threads是低优先级的...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    1 2.1有关线程你必须知道的事 3 2.3volatile与Java内存模型(JMM) 2 2.2初始线程:线程的基本操作 4 2.4分门别类的管理:线程组 2java并行程序基础 5 2.5驻守后台:守护线程(Daemon) 6 2.6先做重要的事:线程...

    ThreadDaemon.java

    ThreadDaemon.java

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    Python守护线程用法实例

    即在线程开始(thread.start())之前,调用setDeamon()函数,设定线程的daemon标志。(thread.setDaemon(True))就表示这个线程“不重要”。 如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用...

    java程序设计于开发 第七讲 多线程

    多线程基本概念 创建线程的方式 线程的生命周期及控制 线程的优先级及调度 多线程的互斥与同步 守护线程 (Daemon) 线程组 (ThreadGroup)

    java线程学习笔记

    1.8 后台线程(daemon) 6 1.9 加入线程(join) 8 1.10 捕获异常(UncaughtExceptionHandler) 9 1.11 线程与任务 10 1.12 让后计算 11 二 共享受限资源 12 2.1 解决共享资源(synchronized、lock) 12 2.1.1 描述...

    《linux/UNIX系统编程手册》书上daemon章节测试实例代码(及简化)

    根据《linux/UNIX系统编程手册》的daemon章节写的一个测试become_daemon()函数程序。代码内容99%以上都是书上给的源码。此处仅注释掉不需要的内容,以及为了简化理解,做了不同平台的适配,(对于源码来说是种倒退,...

    java 编程入门思考

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    Python中Threading用法详解

    daemon thread 守护线程,如果守护线程之外的线程都结束了。守护线程也会结束,并强行终止整个程序。不要在守护进程中进行资源相关操作。会导致资源不能正确的释放。在非守护进程中使用Event。 Thread 类 (group=...

    daemon守护进程经典

    详细介绍了守护进程的原理,及实现,对初学者特别有用

Global site tag (gtag.js) - Google Analytics