`

Java中使用Timer和TimerTask实现多线程

    博客分类:
  • Java
 
阅读更多

Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.TimerTask;
  
public class OneTask extends TimerTask{
  
    private int id;
    public OneTask(int id){
        this.id = id;
    }
      
    @Override
    public void run() {
        System.out.println("线程"+ id +":  正在 执行。。"); 
        //System.gc();
    }   
}

然后主程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Date;
import java.util.Timer;
   
public class Test1 {
       
    public static void main(String[] args) {
        Timer timer = new Timer(); 
  
        timer.schedule(new OneTask(1), 5000);// 5秒后启动任务
          
        OneTask secondTask= new OneTask(2);
        timer.schedule(secondTask, 10003000);// 1秒后启动任务,以后每隔3秒执行一次线程
          
        Date date = new Date();
        timer.schedule(new OneTask(3),new Date(date.getTime()+1000));//以date为参数,指定某个时间点执行线程
          
//      timer.cancel();
//      secondTask.cancel();
        System.out.println("end in main thread...");
    }
}

Timer里面有4个schedule重载函数。而且还有两个scheduleAtFixedRate:

void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

使用scheduleAtFixedRate的话, Timer会尽量的让任务在一个固定的频率下运行。例如:在上面的例子中,让secondTask在1秒钟后,每3秒钟执行一次,但是因为java不是实时的,所以,我们在上个程序中表达的原义并不能够严格执行,例如有时可能资源调度紧张4秒以后才执行下一次,有时候又3.5秒执行。如果我们调用的是scheduleAtFixedRate,那么Timer会尽量让你的secondTask执行的频率保持在3秒一次。运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,secondTask执行一次,因为系统繁忙,之后的3.5秒后secondTask才得以执行第二次,然后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask 将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。

Timer终止的问题:

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。可以通过以下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行; 
(3)调用System.exit方法,使整个程序(所有线程)终止。

TimerTask也有cancel方法。

上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,如果Timer里的所有TimerTask都执行完了,整个程序会退出吗,经测试答案是否定的,例如上面的测试代码,如果只加第一个TimerTask在Timer中执行:

timer.schedule(new OneTask(1), 5000);// 5秒后启动任务
那么5秒以后,其实整个程序还是没有退出,Timer会等待垃圾回收的时候被回收掉然后程序会得以退出,但是多长时间呢?

在TimerTask的run函数执行完以后加上System.gc();就可以了。

分享到:
评论

相关推荐

    Java中的Timer和TimerTask简介(附完整代码实例)

    在Java中,Timer和TimerTask是两个经常用来实现定时器的类。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求。 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,并可以按计划一次或反复...

    Java中的Timer和TimerTask的使用.doc

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

    JAVA定时器之Timer+TimerTask

    在Java编程语言中,`Timer`和`TimerTask`是两个关键类,它们构成了Java的定时执行机制。这两个类在处理周期性任务或者延迟任务时非常有用,它们可以帮助开发者实现程序在特定时间点或者按照一定间隔执行特定操作的...

    使用Timer和TimerTask实现周期任务

    总之,`Timer` 和 `TimerTask` 是 Java 中用于实现周期任务的基础工具,但它们有一定的局限性。在实际开发中,根据项目需求和性能要求,可以考虑使用更高级的并发工具,如 `ScheduledExecutorService`,以获得更好的...

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

    1. **线程安全**:由于`Timer`和`TimerTask`不是线程安全的,因此在多线程的Web应用中,如果多个线程共享同一个`Timer`实例,可能会导致任务调度混乱。为避免这种情况,通常每个任务应拥有自己的`Timer`实例。 2. *...

    JavaTimer和TimerTask实例教程Java开发

    下面将详细介绍`Timer`和`TimerTask`的工作原理以及如何在实际开发中使用它们。 **1. Java Timer类** `Timer`类是线程安全的,它创建了一个后台线程,用于管理计划的任务。当你调用`Timer`的`schedule`或`...

    TimerTask与Timer设计时间监控

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

    解析Java中的Timer和TimerTask在Android中的用法和实例

    总结起来,Java的Timer和TimerTask在Android中是实现定时任务的强大工具,它们允许我们在后台线程中按照预设的时间间隔执行任务,并通过Handler与主线程通信,安全地更新UI。然而,使用时需要注意线程管理、资源释放...

    java类Timer和TimerTask的使用.pdf

    Java中的`Timer`和`TimerTask`类是用于创建和管理定时任务的工具,它们提供了在特定时间点或按照预设间隔执行任务的功能。这两个类是Java标准库`java.util`包的一部分,对于需要定时执行操作的应用场景非常有用。 `...

    详解JAVA Timer和TimerTask

    JAVA TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。它提供了run方法,用于执行任务的逻辑实现。TimerTask可以被Timer调度执行,它可以执行一次或多次,具体取决于Timer的调度方式。 Timer...

    Java--Timer--TimerTask--.rar_java timer

    让我们深入了解一下`Timer`和`TimerTask`的工作原理以及如何在实际开发中使用它们。 `Timer`类是一个抽象工作线程,它负责调度任务的执行。它提供了一种方法来安排一次性或重复性的任务执行。`Timer`的工作机制是...

    Timer与TimerTask(计时器)

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

    java.util.timer实现的简单定时任务

    需要注意的是,`Timer`并不是线程安全的,如果你在一个多线程环境中使用同一个Timer实例来调度任务,可能会遇到意想不到的问题。此外,当主线程结束时,Timer线程可能不会立即停止,导致程序退出前仍有未执行完的...

    java定时任务Timer和TimerTask使用详解

    总结起来,`Timer` 和 `TimerTask` 提供了一种简单的方式在Java中实现定时任务,无论是单次执行还是周期性执行,都能方便地进行调度。但需要注意的是,由于 `Timer` 是基于单线程模型的,如果一个 `TimerTask` 执行...

    java 红绿灯 timer 实现线程操作

    在Java编程中,模拟交通信号灯(红绿灯)是一个常见的多线程示例,它展示了如何使用线程来控制程序的不同部分同时运行。在这个场景中,`Timer`类和`TimerTask`类通常用于定时任务,使得红绿灯状态在预设的时间间隔内...

    ServletContextListener,Timer,TimerTask学习笔记

    然后,`Timer`和`TimerTask`是Java的定时器和定时任务类,它们用于在后台线程中定期执行任务。`Timer`对象负责调度任务,而`TimerTask`则表示具体的任务。创建一个`Timer`实例后,可以通过调用`schedule`或`...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

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

    总结,`java.util.Timer`和`TimerTask`类是Java中用于创建定时任务的基础组件。虽然它们简单易用,但在多线程环境或需要高级调度功能时,可能需要转向`ScheduledExecutorService`。理解这些概念并合理运用,可以帮助...

    Android Timer TimerTask Handler

    - 考虑到`Timer`和`TimerTask`可能存在的内存泄漏问题,特别是在Activity中使用时,记得在不再需要定时任务时取消它们。 - 使用`Handler`时,确保在不需要处理消息时调用`removeCallbacksAndMessages(null)`,防止...

    java中定时器timer类的实现和源代码.docx

    它会维护一个`Vector`(在Java早期版本中使用,现在更推荐使用`ArrayList`或`LinkedList`)来存储`TimerTask`实例,并提供添加、删除以及检查定时器是否到期的方法。`TimerTasks`类还负责启动和停止定时器。 最后,...

Global site tag (gtag.js) - Google Analytics