zoukankan      html  css  js  c++  java
  • 任务调度之Timer与TimerTask配合

    什么是任务调度?

    在实际业务中,我们经常需要定时、定期、或者多次完成某些任务,对这些任务进行管理,就是任务调度。任务调度与多线程密切相关。

    任务调度有多种方式

    Timer与TimerTask配合

    Timer 定时器,能在主线程外另起线程完成任务

    TimerTask 实现Runnable接口的抽象类,相当于一个任务

    来一个简单的例子:

    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TestTimer {
        
        public static void main(String args[]){
    new Reminder(3);
            System.out.println("调度完成。");
        }
        
        public static class Reminder{
            Timer timer;
            
            public Reminder(int sec){
                timer = new Timer();
           //开始调度任务 timer.schedule(
    new TimerTask(){ public void run(){ System.out.println("时间到!");
                //重要:终止内部线程! timer.cancel(); } }, sec
    *1000); } } }

    会输出:

    调度完成。

    时间到!

    原理:Timer的构造函数里会起一个单独的线程(new Thread())来执行计划任务,并在任务完成后结束线程。

    Timer如何终止内部线程?

    1、调用timer的cancle方法(最常用,如上例)

    2、把timer线程设置成daemon线程,(new Timer(true)创建daemon线程),在jvm里,如果所有用户线程结束,那么守护线程也会被终止,不过这种方法一般不用。

    3、当所有任务执行结束后,删除对应timer对象的引用,线程也会被终止。

    4、调用System.exit方法终止程序

    注意点:

    1、每一个Timer仅对应唯一一个线程

    2、Timer不保证任务执行的十分精确。

    3、Timer类的线程安全的

  • 相关阅读:
    【QML Model-View】ListView-简单使用(一)
    QML 界面切换的几种方法(带示例代码)
    QML 常用控件:TextInput, TextField, TextEdit, TextArea(编辑框)用法及自定义
    props参数赋值给data
    nprogress 跳转路由进度条
    小程序页面加水印
    el-table默认展示所有行
    父子路由传参
    IE接口缓存
    wireshark抓包新手使用教程
  • 原文地址:https://www.cnblogs.com/yanze/p/10689269.html
Copyright © 2011-2022 走看看