`
charyle
  • 浏览: 166102 次
  • 性别: Icon_minigender_1
  • 来自: 天蝎座
社区版块
存档分类
最新评论

守护线程如何退出?Timer源码所得

 
阅读更多

近日要做定时任务,看了看java.util.Timer源码,Timer类中有以下三个变量:

 

private TaskQueue queue = new TaskQueue();

    /**
     * The timer thread.
     */
    private TimerThread thread = new TimerThread(queue);

    /**
     * This object causes the timer's task execution thread to exit
     * gracefully when there are no live references to the Timer object and no
     * tasks in the timer queue.  It is used in preference to a finalizer on
     * Timer as such a finalizer would be susceptible to a subclass's
     * finalizer forgetting to call it.
     */
    private Object threadReaper = new Object() {
        protected void finalize() throws Throwable {
            synchronized(queue) {
                thread.newTasksMayBeScheduled = false;
                queue.notify(); // In case queue is empty.
            }
        }
    };

 

     其中thread变量在timer初始化后开始启动,其start就是一个while(true)循环,不断取得queue中任务进行判断。。那么thread线程退出就是个问题了,当然Timer提供了cancel方法。

     当quene变为了空,而这个timer类没有再被引用,那么如果不执行cancel则这个线程一直运行状态。当垃圾回收的时候,while(true)一直运行,所以不会退出。因此当timer进行回收时候,threadReaper 对象回收了,其finalize方法将queue清空,标识变量false,这样while循环中的判断break条件为真,退出循环,函数执行完毕了,线程也会退出了。

     如果timer类不使用了,一定要cancel掉,否则等到垃圾回收线程才能退出。

1
2
分享到:
评论

相关推荐

    守护线程系统-含源码

    在本项目"守护线程系统-含源码"中,开发者利用Spring和Hibernate这两个流行的Java框架,构建了一个能够监控配置线程并发送邮件通知的系统。 首先,我们来了解Spring框架。Spring是一个全面的企业级应用开发框架,它...

    VC 多线程时间计时器timer源码演示.rar

    VC 多线程时间计时器timer源码演示,两个时间计时线程分别运行于各自的线程中,互不影响,可点击按钮控制两个线程同进结束,本源码可向初学者演示如何创建多线程、计时器的使用等,调试环境为VC .NET。

    关于winform使用timer进行多线程操作的例子

    本例子重点介绍了如何利用`System.Timers.Timer`组件来实现这样的多线程操作,特别是针对网段ping功能的实现。`System.Timers.Timer`是一个异步定时器,它在单独的线程上触发`Elapsed`事件,避免了阻塞UI线程。 ...

    我写的Linux版Timer定时器(源码),可在多线程间使用

    这个开源项目提供的就是一个专为Linux设计的多线程安全的Timer类,它允许在多个线程之间同步和交互。 首先,让我们来看看`timer.cpp`文件。这个文件很可能是实现Timer类的主要代码,其中包含了定时器的创建、启动、...

    Java并发Timer源码分析

    Java并发Timer源码分析 Java并发编程是Java编程中一个非常重要的方面,java.util.Timer是Java中的一个基本组件,用于实现延时和周期性任务的执行。但是,Timer存在一些缺陷,如创建唯一的线程来执行所有Timer任务,...

    ASPNET中实现在线用户检测(使用后台守护线程).rar

    守护线程是一种特殊的线程,它在应用程序启动时创建,并在所有其他非守护线程结束后继续运行,直到应用程序关闭。在ASP.NET环境中,我们可以巧妙地运用守护线程来定期更新在线用户列表。 首先,我们需要创建一个...

    Timer控件源码实例

    在这个实例中,我们将深入理解Timer控件的基本概念、用法及其源码分析。 首先,`Timer控件`是一个非可视控件,它在用户界面中不会显示任何图形元素,但可以在指定的时间间隔内触发事件,如`Tick`事件。这个事件可以...

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

    在 Java 中,Timer 的源码中可以看到,Timer 的构造方法中没有设置守护线程,这意味着 Timer 任务默认不是守护线程。如果需要 Timer 任务在后台运行,可以使用 setDaemon(true) 方法将其设置为守护线程。 守护线程...

    多线程同步,互斥,联合,守护,计时器线程Timer

    当所有非守护线程结束时,即使还有守护线程运行,Java虚拟机也会退出。Example9_6.java可能展示了如何创建和使用守护线程。 5. **计时器线程(Timer和TimerTask)**: Java的`java.util.Timer`和`TimerTask`类提供...

    C# Timer的多线程使用方法

    在.NET框架中,C#提供了两种Timer类,用于在多线程环境中实现定时触发操作:System.Threading.Timer和System.Timers.Timer。这两种Timer虽然都与时间调度相关,但在使用上和特性上有所不同。在这个主题中,我们将...

    vb模拟多线程 本地Timer对多线程

    标题提到的“vb模拟多线程 本地Timer对多线程”就是一种常见的解决策略,通过使用Windows API中的定时器(Timer)来模拟多线程的效果。 首先,我们来看一下什么是多线程。多线程是指在一个进程中同时执行多个不同的...

    Timer及多线程编程

    根据提供的文档内容,我们可以深入探讨其中涉及的两个主要知识点:`Timer`的使用以及多线程编程的基础。这里我们将重点放在这些方面,并结合文档中的相关内容进行详细的解释。 ### C#中的Timer #### System....

    单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)

    单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制...

    用线程实现的定时器Timer

    6. **关闭定时器**: 当不再需要定时器时,可以设置线程事件为已触发状态,让线程退出,然后销毁线程和事件对象。 使用这种方式实现的定时器有以下优点: - **独立性**:线程定时器不依赖于窗体消息循环,可以在...

    MFC多线程编程实例----多线程画线源码

    在标题中提到的“MFC多线程编程实例——多线程画线源码”,我们主要关注的是如何在同一个窗口或图形界面上,通过多个线程同时执行画线操作。这通常涉及到以下几个关键知识点: 1. **线程基础**:在计算机科学中,...

    C#多线程定时调用,类似timer,比timer更轻量级

    C#多线程定时调用,类似timer,比timer更轻量级

    taskTimer 线程 任务

    "taskTimer 线程任务"这个主题主要关注如何利用编程语言中的线程机制来创建和管理定时执行的任务。下面我们将深入探讨这个话题。 首先,定时任务的核心在于计划任务的调度。在Java中,`java.util.Timer`类是实现...

    自己编写的Delphi组件定时器Timer,内支持线程,不会像D原生那样卡顿及界面.

    本文将详细介绍一个由个人编写的、内建线程支持的Delphi组件定时器,以及它如何避免原生Timer组件的卡顿问题。 首先,让我们深入理解一下Delphi原生的TTimer组件。TTimer是基于VCL(Visual Component Library)的一...

    timer_timer_源码

    标题“timer_timer_源码”表明我们将探讨一个关于定时器的源代码实现,这可能是某个编程语言中的一个库或者框架。描述中的“good timer for use in your life”暗示了这是一个对日常生活有实际应用价值的定时器设计...

    细细品味C#(Timer及多线程编程).pdf

    System.Windows.Forms.Timer通常用于WinForms应用程序中,其事件处理函数运行在主线程上,因此可以安全地操作UI控件而不会引起线程安全问题。System.Threading.Timer和System.Timers.Timer则更适合于后台操作和服务...

Global site tag (gtag.js) - Google Analytics