`
543089122
  • 浏览: 153197 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Timer和ScheduledExecutorService区别

    博客分类:
  • java
 
阅读更多
Timer里面的任务如果执行时间太长,会独占Timer对象,使得后面的任务无法几时的执行
ScheduledExecutorService不会出现Timer的问题(除非你只搞一个单线程池的任务区)


Timer搞了一个最小堆,每次取距离当前时间最近的那个任务来执行,
创建Timer的时间会创建TimerThread做为执行线程,所以一个Timer对应一个线程
,一个线程当然不能同时执行多个任务啦(当某个任务执行时间很长就看的出来)。

public Timer(String name, boolean isDaemon) {
        thread.setName(name);
        thread.setDaemon(isDaemon);
        thread.start();
    }

当你创建一个Timer的时候就创建了一个执行任务的线程对象,不管你有多少个任务要执行,都只有这一个线程来负责执行任务,它每次从最小堆中取距离当前时间最短的任务来执行,所以如果某个任务非常耗时,那这是不明智的。所以建议这样的情况使用jdk1.5提供的线程池任务管理器。
class TimerThread extends Thread{}


Timer的任务队列是个最小堆java.util.TaskQueue


package thread.timer;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo1 {
	public static void main(String[] args) throws ParseException, InterruptedException {
		/*
		 * Timer里面的任务如果执行时间太长,会独占Timer对象,使得后面的任务无法几时的执行
		 * ScheduledExecutorService不会出现Timer的问题(除非你只搞一个单线程池的任务区)
		 * 
		 * Timer搞了一个最小堆,每次取距离当前时间最近的那个任务来执行,
		 * 创建Timer的时间会创建TimerThread做为执行线程,所以一个Timer对应一个线程
		 * ,一个线程当然不能同时执行多个任务啦(当某个任务执行时间很长就看的出来)。
		 * ScheduledExecutorService创建的线程数量是池子的大小,所以不会出现Timer那样的问题
		 */
		// ScheduledExecutorServiceDemo();
		// timerDemo();

		// Date df = DateFormat.getDateTimeInstance().parse("2011-10-10");
		// System.out.println(df.);
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		String s = sdf.format(new Date());
//		System.out.println(s);
//		convert(s, "yyyy-MM-dd HH:mm:ss");
		
//		say();
		
		ScheduledExecutorService pool = Executors
		.newSingleThreadScheduledExecutor();
		final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		pool.scheduleAtFixedRate(new Runnable() {
//			public void run() {
//				System.out.println(sdf.format(new Date()));
//			}
//		},0, 1000,TimeUnit.MILLISECONDS);
//		pool.schedule(new Runnable() {
//			public void run() {
//				System.out.println(sdf.format(new Date()));
//			}
//		}, 1000, TimeUnit.MILLISECONDS);
//		pool.shutdown();
		Date d1 = new Date();
		Date d2 = new Date();
		d2.setTime(d2.getTime()-1);
		System.out.println(d1.getTime());
		System.out.println(d2.getTime());
		System.out.println(d1.equals(d2));
		System.out.println(d1.compareTo(d2));
	}

	private static long convert(String time, String format)
			throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		// Date sdf = DateFormat.getDateTimeInstance().parse(time);
		long millionSeconds = sdf.parse(time).getTime();
		return millionSeconds;
//		System.out.println(System.currentTimeMillis());
//		System.out.println(millionSeconds);
	}

	private static void say() throws ParseException {
		ScheduledExecutorService pool = Executors
				.newSingleThreadScheduledExecutor();
		long start = System.currentTimeMillis();
		System.out.println("当前时间:"+start);
		long deply = convert("2011-10-09 15:49:00", "yyyy-MM-dd HH:mm:ss")-start;
		System.out.println(deply+"秒后执行");
//		System.out.println(86268719/3600/1000);
		pool.schedule(new Runnable() {
			public void run() {
				while (true) {
					System.out.println("1");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}, deply, TimeUnit.MILLISECONDS);
	}

	private static void ScheduledExecutorServiceDemo() {
		ScheduledExecutorService pool = Executors
				.newSingleThreadScheduledExecutor();
		pool.schedule(new Runnable() {
			public void run() {
				while (true) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("1");
					break;
				}
			}
		}, 1000, TimeUnit.MILLISECONDS);
		pool.schedule(new Runnable() {
			public void run() {
				System.out.println("2");
			}
		}, 3000, TimeUnit.MILLISECONDS);
	}

	private static void timerDemo() {
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("1");
				}
			}
		}, 100, 2000);
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("2");
			}
		}, 1000, 1000);
	}
}


分享到:
评论

相关推荐

    Java并发Timer源码分析

    Java并发编程是Java编程中一个非常重要的方面,java.util.Timer是Java中的一个基本组件,用于实现延时和周期性任务的执行。但是,Timer存在一些缺陷,如创建唯一的线程来执行所有Timer任务,如果一个timer任务的执行...

    简单的timer例子

    在这个实例中,我们将探讨`Timer`类的主要用法和相关概念。 首先,`Timer`类创建了一个定时器对象,它可以调度`TimerTask`实例的执行。`TimerTask`是Java中的一个抽象类,你需要创建它的子类并重写`run()`方法来...

    android定时器Timer实例

    总之,`Timer`和`TimerTask`在Java和Android开发中提供了一种简单的方式来安排未来的任务执行。但是,在实际的Android应用开发中,我们需要根据具体需求选择合适的定时器实现方式,以达到最佳性能和稳定性。理解各种...

    JavaTimer和TimerTask实例教程Java开发

    在Java编程语言中,`Timer`和`TimerTask`是两个重要的类,它们用于调度周期性的任务执行。这两个类属于`java.util`包,提供了在后台线程中延迟执行任务或者定期执行任务的能力,这对于创建定时任务或者实现定时器...

    timer写的任务池

    在Java编程语言中,`Timer`和`TimerTask`是两个关键类,它们构成了一个简单但功能强大的任务调度系统,可以用于执行周期性或者延迟的任务。`Timer`类是一个线程,它负责调度和执行`TimerTask`实例。`TimerTask`则是...

    Timer定时器的使用方法

    在Java编程语言中,`java.util.Timer` 和 `java.util.TimerTask` 类是用于执行定期或延时任务的核心组件。它们允许开发者在指定的时间间隔内执行特定的操作,这对于实现定时任务,如定时备份、轮询服务或者执行周期...

    时钟Timer钟表Timer

    1. Java:Java提供java.util.Timer和java.util.concurrent.Timer类,以及ScheduledExecutorService接口来实现定时任务。 2. Python:Python的time模块提供了简单的计时功能,而threading模块则提供了更复杂的定时器...

    Timer-java.rar_java timer_timer_timer java

    除了`java.util.Timer`,Java 5引入了`java.util.concurrent.ScheduledExecutorService`,它提供了更高级的定时任务调度功能,如精确的定时、定时周期的调整以及更灵活的并发控制。 总结起来,这个项目使用了Java...

    TimerTask与Timer设计时间监控

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

    taskTimer 线程 任务

    在多线程环境下,推荐使用`java.util.concurrent.ScheduledExecutorService`,它提供了更高级的线程管理和调度功能,比如支持并发控制、延迟执行和精确的定时任务。 在实际应用中,定时任务常用于数据库备份、数据...

    sample-Timer.rar_Timer ja_mftimer_timer java

    在游戏开发和需要定时事务处理的场景中,`Timer`的使用显得尤为重要。`sample-Timer.rar`提供的示例代码展示了如何在Java ME环境中有效地利用`Timer`进行编程。 `Timer`类位于`javax.microedition.util`包下,它...

    java定时器(timer类使用详解)

    在本文中,我们将深入探讨`Timer`类的工作原理、常用方法以及如何使用它来创建和管理定时任务。 `Timer`类主要用于计划在将来某个时间点执行的任务,这通常通过`TimerTask`类来实现,`TimerTask`是实现了`Runnable`...

    ScheduledExecutorService任务定时代码示例

    ScheduledExecutorService 是一个接口,用于管理和执行延迟或周期性的任务。它提供了多种方法来执行任务,如 scheduleAtFixedRate、scheduleWithFixedDelay 等。ScheduledExecutorService 可以用来实现各种定时任务...

    android中timer的使用

    在Android应用开发中,合理使用`Timer`能够帮助我们实现很多实用的功能,但同时也要注意其潜在的问题,如线程安全和性能影响。在设计系统时,应根据具体需求选择最适合的定时器实现,以确保应用的稳定性和效率。

    java定时任务调度之Timer 简单示例

    在本文中,我们将深入探讨`Timer`类的基本使用和示例,帮助你理解如何在Java程序中实现简单的定时任务。 首先,`Timer`类提供了计划任务的能力,它可以按照预定的时间间隔安排任务执行。创建一个`Timer`对象后,你...

    Web中使用Timer和TimerTask定时获取数据。

    4. **替代方案**:考虑到`Timer`和`TimerTask`的一些限制,Java 5引入了`ScheduledExecutorService`,它提供了一套更强大且线程安全的定时任务调度接口。在新的项目中,通常推荐使用`ScheduledExecutorService`而...

    java5定时器java Timer

    这个类是Java早期版本中对定时任务管理的一个重要实现,尽管在Java 5之后,`java.util.concurrent`包中的`ScheduledExecutorService`被推荐使用,但`Timer`仍然在很多场景下被广泛采用。 `Timer`类主要有两个核心...

    使用Timer和TimerTask实现周期任务

    在这种情况下,`java.util.Timer` 和 `java.util.TimerTask` 类提供了非常有用的机制来实现周期性任务。本文将深入探讨这两个类的使用方法及其相关知识点。 首先,`Timer` 类是一个线程类,它负责调度任务的执行。...

    java_Timer_thread.rar_java thread timer_java timer_java 定时器_java

    Timer类提供了计划任务的方法,如`schedule(TimerTask task, long delay)`和`schedule(TimerTask task, Date firstTime, long period)`。这些方法可以用来安排一个`TimerTask`实例在未来某一时刻或以一定间隔重复...

    Timer schedule

    如精度不够高,且当`Timer`关联的线程被中断或抛出未捕获异常时,整个`Timer`会被取消,因此在Java 5及更高版本中,通常推荐使用`ScheduledExecutorService`替代`Timer`,它可以提供更灵活和可控的定时任务管理。...

Global site tag (gtag.js) - Google Analytics