Java: Timer启用后无法停止?如何停止Timer

本文探讨了Java中使用Timer和TimerTask进行任务调度时遇到的问题:即使所有任务执行完毕,计时器线程也未能自动退出。通过分析JDK文档并尝试不同解决方案,最终确定了在某个TimerTask中调用System.gc()即可使程序正常结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用Timer和TimerTask可以实现定时完成某些任务。

但是在运行过程中出现了很奇怪的现象:
所有TimerTask都完成了,按理说线程应该自动退出,但是它却没有!

在JDK1.5的文档Timer类中,有这样一句话:
“对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。”

但是这个“很长时间”是多长呢?一直等也没见它停止。。。

既然会成为垃圾回收的对象,那么我们就主动让系统回收一下吧。在每个TimerTask的run()方法最后加上一行代码:
System.gc();

然后再运行程序,搞定,正常了。

很自然会想到应该保证在Timer的最后一个TimerTask的最后调用gc(),但是经尝试发现只要在某一个TimerTask中调用过gc(),然后程序就能正常结束。并且gc()也不必放在最后

package tmp;

import java.util.Date;
import java.util.TimerTask;

/**
 * Created by Gracecoder on 2017/11/28.
 */
public class MyTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("任务执行了,时间为" + new Date());
//        cancel();
        System.gc();
    }
}
package tmp;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

/**
 * Created by Gracecoder on 2017/11/28.
 */
public class Test1 {

    public static void main(String[] args){

        System.out.println("当前时间为:" + new Date());

        Calendar calendarRef = Calendar.getInstance();
        calendarRef.add(Calendar.SECOND,10);
        Date runDate = calendarRef.getTime();

        MyTask task = new MyTask();
//        Timer timer = new Timer(true);
//如果设为demon线程,那可能demon线程还没执行操作,虚拟机就已经退出了,进程结束了!那是因为JRE只根据前台线程是否还在执行来判断程序是否结束而不管后台线程。
        Timer timer = new Timer();
        timer.schedule(task,runDate);


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值