Java多线程编程核心技术(第五章定时器Timer笔记)

1在JDK库中Timer类主要负责计划任务的执行,封装的任务类却是TimerTask类,执行任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。
2.用法:新建类集成TimerTask()类,设置定时类private static Timer timer = new Timer();
用法:

package com.satx.thread;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class Thread6{

    private static Timer timer = new Timer(true);

    static public class Task extends TimerTask{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("运行时间"+new Date());
        }
    }
    public static   void main(String[] args) throws InterruptedException, ParseException {
        Task task = new Task();
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-01-24 17:05:30");
        System.out.println("运行时间:"+date+"系统时间:"+new Date());
        timer.schedule(task, date);
    }
}

注意:Timer()里面的值如果不设置,则默认为非守护线程,在程序运行的时候时间大于现在时间运行线程里面的,然后控制台一直处于运行状态,小于的时候等待现在时间到达设定时间则输出语句,控制台也一直处于运行状态。但是里面设置为true的话,此线程即为守护线程,当开始时间大于现在时间 ,则不输出线程里面语句直接结束,开始时间小于结束时间的时候,输出县城里面语句结束。
3.TimerTask是以队列的方式一个一个被顺序的执行的,所以执行时间跟设定时间或许有延迟。
4.timer.schedule(TimerTask task,Date date,long period)表示按指定的间隔周期性地无限循环地执行某一任务(定时任务)。
5.任务执行时间拖延,在执行的定时任务方法里加上睡眠时间,设定间隔四秒,睡眠五秒,则第一次结束时间基本就为第二次开始时间,第一次开始和第二次开始基本5秒间隔。
6.TimerTask类中的cancel()方法是将自身从任务队列中被移除,其他任务不受影响:this.cancel();
7.Timer里面的cancel()方法是将任务队列中的全部任务清空,并且进程被销毁,按钮由红色变灰色。
8.timer.schedule(TimerTask task,long delay):以当前的时间为参考时间,在此基础上延迟指定的毫秒数后执行一次TimerTask任务。
9.timer.schedule(TimerTask task,long delay,long period):以当前时间为参考时间,delay毫秒数之后执行task任务,然后perriod毫秒为循环。
10.timer.scheduleAtFixedRate(TimerTask task,Date date,long period)居于追赶性,即当设定时间小于现在的时间时,会去执行之前的操作,schedule则不具有追赶性。

public class Thread8{

    private static int count = 0;
    private static Timer timer = new Timer();

    static public class Task extends TimerTask{

        @Override
        public void run() {
            count++;
            System.out.println("begin:"+new Date());
            try {
                //Thread.sleep(3000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(count == 10){
                timer.cancel();
            }
            System.out.println(count);
            System.out.println("end:"+new Date());
        }
    }
    public static   void main(String[] args) throws InterruptedException, ParseException {
        Task task = new Task();
        System.out.println(new Date());
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-1-25 11:03:10");
        timer.scheduleAtFixedRate(task, date, 1000);
        //timer.schedule(task, date, 1000);
    }
}

你可能感兴趣的:(多线程编程)