`
zhangwei_david
  • 浏览: 474726 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ScheduledThreadPoolExecutor与Timer

 
阅读更多

    Timer类负责管理延迟任务以及周期任务。然而,Timer存在一些固有的缺陷。
    Timer 在执行定时任务时只会创建一个后台线程。如果某个线程执行的时间过长,那么将破会其他定时任务的精确性。
   Timer的另一个问题是,如果TimerTask抛出一个非检查异常,由于Timer不捕获异常导致终止定时任务线程。在这样情况下,Timer无法恢复线程的执行,而是错误地认为整个Timer都被取消了。因此,已经被调度但尚未执行的TimerTask将不会再被执行,新的任务也不能被调度。

   Timer支持基于绝对时间而不是相对时间的调度机制,因此任务的执行对系统时间的变化很敏感。



ScheduledThreadPoolExecutor在调度多个定时任务时要好于Timer。

   ScheduledThreadPoolExecutor 只支持相对时间的调度。

 

 

 

 

import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: Ten.java, v 0.1 2014年11月12日 下午3:30:39 zhangwei_david Exp $
 */
public class Newline extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
        }
        System.out.println("\r\n");
    }

}

 

import java.util.TimerTask;

/**
 *
 * @author zhangwei_david
 * @version $Id: One.java, v 0.1 2014年11月12日 下午3:29:31 zhangwei_david Exp $
 */
public class print extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        System.out.print("-");
    }

}

import java.util.TimerTask;

/**
 *
 * @author zhangwei_david
 * @version $Id: Stop.java, v 0.1 2014年11月12日 下午4:16:50 zhangwei_david Exp $
 */
public class Stop extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        throw new RuntimeException("运行异常");
    }

}

 

import java.util.Date;
import java.util.Timer;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: TimerClient.java, v 0.1 2014年11月12日 下午3:31:00 zhangwei_david Exp $
 */
public class TimerClient {
    public static void main(String[] args) {
        Timer timer = new Timer();
        Date d = new Date();
        timer.schedule(new print(), d, TimeUnit.SECONDS.toMillis(2));
        timer.schedule(new Newline(), d, TimeUnit.SECONDS.toMillis(4));
        timer.schedule(new Stop(), TimeUnit.MINUTES.toMillis(1));
    }
}

 执行结果是:

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-Exception in thread "Timer-0" java.lang.RuntimeException: 运行异常
	at com.cathy.demo.concurrency.schedule.Stop.run(Stop.java:21)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)

 

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: ScheduledThreadClient.java, v 0.1 2014年11月12日 下午3:47:37 zhangwei_david Exp $
 */
public class ScheduledThreadClient {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        ScheduledExecutorService ses = new ScheduledThreadPoolExecutor(10);
        ses.scheduleAtFixedRate(new print(), 0, 2, TimeUnit.SECONDS);
        ses.scheduleAtFixedRate(new Newline(), 2, 4, TimeUnit.SECONDS);
        ses.scheduleWithFixedDelay(new Stop(), 1, 1, TimeUnit.MILLISECONDS);
    }

}

 结果是:

---

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

-

 

 

 

0
0
分享到:
评论

相关推荐

    定时器Timer

    这通常涉及创建一个 `TimerTask` 对象,它定义了要执行的任务,然后将其与 `Timer` 关联。 - `TimerTask`:这是 `Timer` 调度的任务,是一个抽象类,你需要继承并覆盖其 `run()` 方法来定义要执行的具体任务。 2. ...

    java_Timer_thread.rar_java thread timer_java timer_java 定时器_java

    Java中的定时器(Timer)是Java.util包下用于执行定期任务的一个类,它与线程(Thread)紧密关联,能够帮助开发者实现定时执行特定任务的需求。这个机制在多线程编程(multithreading)中非常有用,特别是在需要定期...

    定时器Timer用法及其源码

    `Timer`类的创建与使用 创建一个`Timer`对象非常简单,只需要调用其构造函数即可: ```java Timer timer = new Timer(); ``` ### 2. 定时任务的调度 `Timer`类主要通过`schedule`系列方法来安排任务的执行。...

    详解JAVA Timer和TimerTask

    从JDK5开始,可以使用ScheduledThreadPoolExecutor来替代Timer。ScheduledThreadPoolExecutor提供了更强大的调度功能,可以实现更复杂的定时任务。例如,可以使用ScheduledThreadPoolExecutor来实现固定频率的任务...

    Java中Timer的用法详解

    `TimerTask.cancel()` 只会取消当前正在执行的任务,而`Timer.cancel()` 会取消所有与该`Timer`关联的任务并停止`Timer`线程。 5. **注意事项**: - `Timer` 类的线程是非守护线程,这意味着只要还有`TimerTask` ...

    java定时器应用 timertask类

    Java 5之后,`ScheduledExecutorService`和`ScheduledThreadPoolExecutor`提供了更强大的定时任务处理能力,它们是基于并发包(`java.util.concurrent`)的,具有更好的线程管理和取消任务的能力,因此在现代Java开发...

    Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能

    在Java 1.6版本之后,`java.util.concurrent` 包下引入了`ScheduledThreadPoolExecutor`,这是一个非常强大的工具,可以实现定时器和延时加载功能,相比旧的`Timer`类,它提供了更多的控制和并发处理能力。...

    paobiao.rar_定时器

    2. **定时器的使用**:创建`TimerTask`实例后,我们将其与`Timer`关联。例如: ```java TimerTask task = new TimerTask() { @Override public void run() { // 更新秒表状态的代码 } }; ``` 然后,我们...

    Timer.rar_Windows编程_Unix_Linux_

    Timers schedule one-shot or recurring TimerTask tasks for execution. Prefer java.util.concurrent.ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor for new code.

    java在服务启动的时候启动定时器

    与`Timer`相比,`ScheduledExecutorService`提供了更丰富的调度选项,并且不会因单个任务的异常而影响其他任务。 ### 2.2 优点 - 支持取消任务 - 可以设置任务的执行顺序 - 支持固定延迟和固定速率的调度 - 提供了...

    java定时器服务!!

    在这里,`initialDelay`、`period`和`TimeUnit`与`Timer`类似,但`ScheduledExecutorService`提供了更细粒度的时间控制和更好的线程管理。 总结来说,Java定时器服务主要通过`Timer`和`TimerTask`实现,用于计划...

    定时程序-java版

    - `scheduleWithFixedDelay(TimerTask task, long delay, long interval)`:与`scheduleAtFixedRate`类似,但考虑到执行时间,下一个任务的启动时间会考虑上一个任务实际耗时。 4. **示例代码**: ```java ...

    java定时器

    `ScheduledThreadPoolExecutor`是实现该接口的一个类,可以替代`Timer`类以获得更好的性能和灵活性。 7. **使用场景**:Java定时器适用于多种场景,如定期检查数据库连接、定期备份数据、执行清理任务、实现心跳...

    javathread类源码-Java-ScheduledThreadPoolExecutor-Demo:教程的源代码

    java线程类源码Java ScheduledThreadPoolExecutor演示 java.util.concurrent ScheduledThreadPoolExecutor作为java.util.Timer类的现代替代。

    java schedule

    除了`Timer`和`TimerTask`,Java 5引入了`java.util.concurrent`包,其中包含更强大的`ScheduledExecutorService`接口和`ScheduledThreadPoolExecutor`类。`ScheduledExecutorService`提供了一组用于延迟执行或定期...

    java实现定时器代码

    例如,使用`ScheduledThreadPoolExecutor`实现定时器: ```java ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -> { // 定义任务 }; executor....

    java 写的定时器

    实现 `ScheduledExecutorService` 的常见类有 `ScheduledThreadPoolExecutor`。下面是一个示例: ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import ...

    java定时器(定时任务)

    - 与 `Timer` 不同,`ScheduledExecutorService` 在任务出现异常时不会停止整个服务,而是仅取消当前任务,使得其他任务可以继续执行。 - 当不再需要定时任务时,可以通过 `shutdown()` 或 `shutdownNow()` 方法...

    JAVA定时任务

    例如,通过阅读`ScheduledThreadPoolExecutor`的源码,我们可以了解其调度策略和线程池的管理方式。同时,利用IDE(如IntelliJ IDEA或Eclipse)的调试工具,可以帮助我们更好地理解定时任务的执行流程。 此外,工具...

    Java语言定时调度任务之实现.pdf

    Java的Executor框架提供了线程池管理的相关类,如ThreadPoolExecutor和ScheduledThreadPoolExecutor,后者支持定时或周期性的任务调度。 线程池调度的优点在于可以重用线程,减少线程创建和销毁的开销,提高执行...

Global site tag (gtag.js) - Google Analytics