`

java调度:(三)Timer中的单线程守护

 
阅读更多

早听说Timer中是单守护进程在执行所有的任务,在调度的时候会有一些问题,现做下面例子来测试:

首先做两个简单的任务:

1. TimerJOB1

package test;

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

public class TimerJOB1 extends TimerTask {
	public TimerJOB1(){
		super();
	}
	@Override
	public void run() {
		System.out.println("TimerJOB1:开始执行时间:"+new Date());
		try {
			//让线程睡30秒
			Thread.sleep(1000*30);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("TimerJOB1结束执行时间:"+new Date());
		
	}

}

 

2.TimerJOB2

package test;

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

public class TimerJOB2 extends TimerTask {
	public TimerJOB2(){
		super();
	}
	@Override
	public void run() {
		System.out.println("TimerJOB2:开始执行时间:"+new Date());
		try {
			//让线程睡30秒
			Thread.sleep(1000*30);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("TimerJOB2结束执行时间:"+new Date());
		
	}

}

 

3. 从现在开始 1 秒钟之后,每隔 5秒执行一次 TimerJob1 ,因为TimerJob1 的执行时间是大于30s ,那么在第一次调度未完成之前第二次调度就应该开始了,会发生什么事呢?

package test;
import java.util.Timer; 

public class TestTimer {	
	
	 public static void main(String[] args) { 
	 Timer timer = new Timer(); 
	 long delay1 = 1 * 1000; 
	 long period1 = 5*1000; 
	 // 从现在开始 1 秒钟之后,每隔 5秒执行一次 job1 
	 timer.schedule(new TimerJOB1(), delay1, period1); 
	 /**
	  * <pre>
	  * 执行结果:
	  * TimerJOB1:开始执行时间:Fri Feb 22 15:20:32 CST 2013
		TimerJOB1结束执行时间:Fri Feb 22 15:21:02 CST 2013
		TimerJOB1:开始执行时间:Fri Feb 22 15:21:02 CST 2013
		TimerJOB1结束执行时间:Fri Feb 22 15:21:32 CST 2013
		TimerJOB1:开始执行时间:Fri Feb 22 15:21:32 CST 2013
		TimerJOB1结束执行时间:Fri Feb 22 15:22:02 CST 2013
		TimerJOB1:开始执行时间:Fri Feb 22 15:22:02 CST 2013
     </pre>
	  */
	 
		 } 
	}

 由上面可以看出,只有在当前的JOB完成之后才会执行下次job.

4. 分别调用两个job,都是每隔5秒,及第一个job第一次还没有执行完,第二个job第一次与第一个job第二次都该执行了,会一直调用一个job还是job1与job2轮换调用?

package test;
import java.util.Timer; 

public class TestTimer {	
	
	 public static void main(String[] args) { 
	 Timer timer = new Timer(); 
	 long delay1 = 1 * 1000; 
	 long period1 = 5*1000; 
	 // 从现在开始 1 秒钟之后,每隔 5秒执行一次 job1 
	 timer.schedule(new TimerJOB1(), delay1, period1); 
	 long delay2 = 1 * 1000; 
	 long period2 = 1*5000; 
	 // 从现在开始 1 秒钟之后,每隔 5 秒钟执行一次 job2 
	 timer.schedule(new TimerJOB2(), delay2, period2); 
	 /*
	 TimerJOB1:开始执行时间:Fri Feb 22 15:25:47 CST 2013
	 TimerJOB1结束执行时间:Fri Feb 22 15:26:17 CST 2013
	 TimerJOB2:开始执行时间:Fri Feb 22 15:26:17 CST 2013
	 TimerJOB2结束执行时间:Fri Feb 22 15:26:47 CST 2013
	 TimerJOB1:开始执行时间:Fri Feb 22 15:26:47 CST 2013
	 TimerJOB1结束执行时间:Fri Feb 22 15:27:17 CST 2013
	 TimerJOB2:开始执行时间:Fri Feb 22 15:27:17 CST 2013
	 TimerJOB2结束执行时间:Fri Feb 22 15:27:47 CST 2013
	 TimerJOB1:开始执行时间:Fri Feb 22 15:27:47 CST 2013
	 TimerJOB1结束执行时间:Fri Feb 22 15:28:17 CST 2013
	 TimerJOB2:开始执行时间:Fri Feb 22 15:28:17 CST 2013
	 */
	 } 
	

}

 

 

 

 

分享到:
评论

相关推荐

    java定时器Timer

    - `Timer`类使用单线程模型,这意味着所有调度的任务都会在一个线程中顺序执行。如果一个任务执行时间过长,会影响其他任务的调度。 - 使用`Timer`时需要注意内存泄漏问题,因为`TimerTask`实例如果不被正确取消,...

    Java定时器Timer简述.pdf

    Java定时器Timer是Java编程语言中用于计划执行任务的一种工具类。Timer类主要提供了定时任务的安排执行,对于需要在指定时间后、或者以固定周期重复执行任务的场景非常有用。本文档中介绍的Timer类的实现以及如何...

    Java中的Timer和TimerTask的使用.doc

    在Java编程语言中,`Timer`和`TimerTask`是两个关键的类,它们用于创建和管理定时任务。`Timer`类提供了一种机制来安排在未来某一特定时间或以固定间隔执行任务,而`TimerTask`是这些任务的实现基础。 `Timer`类是...

    2020老杜最新Java零基础进阶视频教程-多线程课件

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个不同的任务,从而提高了程序的效率和响应性。在Java中,多线程的实现主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类 当...

    定时器Timer实例.rar

    - `Timer`线程是非守护线程,如果不手动取消,程序可能不会结束。 - 多个`TimerTask`可能会并发执行,如果需要顺序执行,需要额外处理同步问题。 - 使用`ScheduledExecutorService`(属于`java.util.concurrent`...

    java 计时器

    `Timer`类是Java中的一个线程安全的类,它提供了一个调度服务,用于安排在单个后台线程上运行的任务。`Timer`类的主要方法包括: - `schedule(TimerTask task, long delay)`: 这个方法会在指定延迟后首次执行任务...

    TimerTask与Timer设计时间监控

    在Java编程语言中,`TimerTask`和`Timer`是两个关键类,它们用于实现定时任务和调度。这两个类在处理需要定期执行的任务时非常有用,例如数据刷新、任务调度或者周期性的系统检查等。本篇文章将深入探讨`TimerTask`...

    Timer与TimerTask(计时器)

    然而,需要注意的是,在多线程环境中使用`Timer`时要特别小心,因为默认情况下`Timer`是单线程的,这可能会导致任务之间的相互影响。在实际应用中,开发者需要根据自己的需求选择合适的执行策略,并合理地管理任务的...

    java定时器服务!!

    需要注意的是,`Timer`和`TimerTask`并不提供精确的时间控制,因为它们是基于Java的守护线程运行的,可能会受到垃圾收集和其他系统活动的影响。对于需要高精度定时任务的场景,建议使用`java.util.concurrent`包下的...

    Java多线程

    ### Java多线程知识点详解 #### 一、多线程基本概念 - **进程与线程的区别** - 每个进程都是一个独立的应用程序,具有独立的内存空间。 - 同一个进程中的线程共享进程的内存和资源(如堆内存和方法区),但每个...

    java 定时任务及jar包

    - 注意在生产环境中,为了保证服务稳定性,通常会将定时任务单独部署在守护线程或者独立的服务中。 以上就是关于Java定时任务的一些基本知识点,包括`java.util.Timer`、`ScheduledExecutorService`以及Spring框架...

    java定时器

    - `Timer`是单线程的,所以如果你的任务中有阻塞操作,将会阻塞其他任务的执行。 - 为了避免内存泄漏,记得在不再使用定时器时调用`cancel()`方法。 - 对于需要高并发、线程安全的定时任务,推荐使用`java.util....

    TimerDemo.tar.gz

    `Timer`类是Java中的一个调度工具,它可以安排在未来某一时间启动、重复或者取消的任务。`Timer`创建了一个后台线程,用于调度和执行任务,因此不会阻塞主线程,这对于Android应用尤其重要,因为主线程负责UI更新和...

    利用线程数据上传demo

    在这个场景中,我们可能创建一个后台线程,例如使用`Thread.setDaemon(true)`,使其成为守护线程,以便在所有非守护线程结束后继续运行,实现不间断的数据上传。此外,我们还需要考虑线程安全,确保在多线程环境下对...

    java范例开发大全源代码

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 ...

    java范例开发大全

    实例229 变形金刚中的守护神(守护线程) 424 实例230 查看JVM中所有的线程的活动状况 426 实例231 模仿网络快车下载工具下载文件 428 13.2 多线程的同步与互斥 436 实例232 多线程同步方法的实例 436 实例233 ATM...

    Java范例开发大全 (源程序)

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 小九九...

    Java范例开发大全(全书源程序)

    实例229 变形金刚中的守护神(守护线程) 424 实例230 查看JVM中所有的线程的活动状况 426 实例231 模仿网络快车下载工具下载文件 428 13.2 多线程的同步与互斥 436 实例232 多线程同步方法的实例 436 实例233...

    java范例开发大全(pdf&源码)

    实例229 变形金刚中的守护神(守护线程) 424 实例230 查看JVM中所有的线程的活动状况 426 实例231 模仿网络快车下载工具下载文件 428 13.2 多线程的同步与互斥 436 实例232 多线程同步方法的实例 436 实例233 ATM...

    Memologue:提醒自己做周期性任务

    在Java编程中,实现周期性任务提醒涉及到多方面的知识,包括线程处理、定时器(Timer)类、事件调度以及数据持久化等。以下将详细解析这些关键知识点: 1. **线程处理**:Java中的线程机制是实现定时任务的基础。在...

Global site tag (gtag.js) - Google Analytics