Java多线程————定时器

一、定时器 定时器是一种控制任务延时调用,或者周期调用的技术。 作用:闹钟、定时邮件发送。

1、定时器的实现方式 方式一:Timer 方式二: ScheduledExecutorService

二、Timer定时器 1、构造器和方法

2、Timer定时器的特点和存在的问题

    Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。 可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行。

代码实例

package prohome;  
  
import java.util.Date;  
import java.util.Timer;  
import java.util.TimerTask;  
  
public class TimerDemo1 {
          
     
    public static void main(String[] args) {
          
     
        // 1. 创建 Timer 定时器  
        Timer timer = new Timer();// 定时器本身就是一个单线程  
        // 2. 调用方法处理 定时任务  
        timer.schedule(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName()+"执行AAA~~"+new Date());  
            }  
  
        },0,2000);  
        timer.schedule(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName() + "执行BB~~~"+ new Date());  
  
            }  
        }, 0, 2000);  
  
        timer.schedule(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName() + "执行CCC~~~"+ new Date());  
            }  
        }, 0, 3000);  
    }  
    }

二、ScheduledExecutorService定时器 1、ScheduledExecutorService是 jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷, ScheduledExecutorService内部为线程池。

2、ScheduledExecutorService的优点 基于线程池,某个任务的执行情况不会影响其他定时任务的执行。

package prohome;  
  
import java.util.Date;  
import java.util.TimerTask;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
  
public class TimerDemo2 {
          
     
    public static void main(String[] args) {
          
     
        // 创建ScheduleExecutorService 线程池 做定时器  
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);  
        // 开启定时任务  
        pool.scheduleAtFixedRate(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName()+"执行输出:AAA==>"+new Date());  
            }  
        },0,2, TimeUnit.SECONDS);  
  
        pool.scheduleAtFixedRate(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName()+"执行输出:BBB==>"+new Date());  
            }  
        },0,2,TimeUnit.SECONDS);  
        pool.scheduleAtFixedRate(new TimerTask() {
          
     
            @Override  
            public void run() {
          
     
                System.out.println(Thread.currentThread().getName() + "执行输出:CCC==》 " + new Date());  
            }  
        }, 0, 2, TimeUnit.SECONDS);  
    }  
}
经验分享 程序员 微信小程序 职场和发展