zoukankan      html  css  js  c++  java
  • Timer与TimerTask

    今天看了一下Timer与TimerTask的用法并且在网上找了些相关的例子,
    线程启动之后,定时调用run()方法,执行具体任务操作,可以重载TimerTask类的方法run(),自定义用户想要的操作。
    例子一:
    //这里只是简单的打印一下任务参数

    public class myTask
    extends java.util.TimerTask {
    String jobName;
    private int i;
    public void run() { //run in interface Runnable
    System.out.println(jobName);
    }

    public myTask(String jobName) {
    this.jobName = jobName;
    }
    }

    //doTask.java

    import java.util.*;
    import java.io.*;

    public class doTask {
    private java.util.Timer timer;
    private java.util.TimerTask task;
    public doTask(java.util.TimerTask task) {
    this.timer = new Timer();
    this.task = task;
    }
    public void start(int delay, int internal) {
    timer.schedule(task, delay * 1000, internal * 1000);//利用timer.schedule方法
    }

    public static void main(String[] args) {
    java.util.TimerTask task1 = new myTask(" Job 1");
    java.util.TimerTask task2= new myTask("Job 2");
    doTask pt = new doTask(task1);
    pt.start(1,3);
    doTask pt2 = new doTask(task2);
    pt2.start(1,1);
    }

    }

    这是在一定的间隔时间执行重复的任务,java.util.Timer可以很简单的帮你实现。当然你也可以用多线程来实现。下面是用java.util.Timer来实现这个功能。

    例子二:
    //文件TimerUse
    package src;

    import java.util.*;
    import java.io.*;

    public class TimerUse
    {
    public static void main(String[] args)
    {
    PickTask pt = new PickTask();
    pt.start(1,3);
    }
    }
    //文件PickTask
    package src;

    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.Timer;
    import java.util.TimerTask;

    public class PickTask
    {
    private Timer timer;

    public PickTask(){
    timer = new Timer();
    }

    private TimerTask task = new TimerTask()
    {
    public void run(){

    try{
    BufferedReader br = new BufferedReader(new FileReader("ming.txt"));
    String data = null;
    while((data=br.readLine())!=null){
    System.out.println(data);
    }
    }
    catch(FileNotFoundException e){
    System.out.println("can not find the file");
    }
    catch(IOException e){
    e.printStackTrace();
    }
    }
    };

    public void start(int delay,int internal )
    {
    timer.schedule(task,delay*5000,internal*1000);
    }
    }

    (1)方法选择。

    一,使用高级的线程API,包括:
    1.如果想重复的调用某个任务,或者想在一定延迟之后进行某项工作,推荐使用java.util.Timer和java.util.TimerTask组合;
    2.如果想写一个GUI程序,推荐使用java.swing.Timer;
    3.类SwingWorker用于后台线程。

    二,继承java.lang.Thread类。

    三,实现Runnabl接口。

    (2)方法介绍。

    1.使用java.util.Timer 和 java.util.TimerTask。

    Timer类构造器有:
    Timer() ; // 默认
    Timer( boolean isDaemon ) ; // 是否是daemon线程
    用法:
    用一个类(MyTask)继承TimerTask,把要执行的任务放在该类的run方法中,然后创建一个Timer对象(新线程):
    Timer timer = new Timer();
    并拟定计划:
    timer.schedule( new MyTask() , delayedTimeInMillisecond ); // 用于延迟一定时间后执行
    timer.schedule( new MyTask() , time ); // 用于在给定的时间点执行,time是Date类的一个实例
    timer.schedule( new MyTask(), initialDelay, interval ) // 用于重复执行
    终止线程的方法:
      timer.cancel();
      当只剩下daemon线程时
      当MyTaskd的run()执行完时,去除所有对timer的引用
      System.exit(0);  // 所有的线程都终止

    2.继承Thread类并覆盖run()方法

    没什么好说的,但是要记得start()哦~
    Thread的构造器有:
    Thread( threadName );
    Thread( runnableObject , threadName );

    3.实现Runnable接口

    方法就是实现一个Runnable的类,并把实例传给Thread类的构造器,以创建新的线程。如:
    public class MyTask implements Runnable {
    private int index;
    public MyTask( int index ) { this.index = index; }
    public void run() {
    System.out.prinln( " Task " + index + " is running." );
    }
    public static void main( String[] args ) {
    for( int i=0; i<100; i++ )
    new Thread( new MyTask(i), String.valueOf(i) ).start();
    }
    }


    有的时候我们需要每隔一段时间去执行某个任务,在Java中提供了Timer and TimerTask来完成这个任务,本文提供一个应用程序的源代码告诉你如何使用这两个类。

    Timer和TimerTask的方法很少,使用起来也非常方便。希望如果遇到问题参考一下API doc,里面写的很清楚。TimerTask是个抽象类,他扩展了Object并实现了Runnable接口,因此你必须在自己的Task中实现public void run()方法。这也就是我们需要执行的具体任务。Timer实际上是用来控制Task的,他提供的主要方法是重载的schedule()方法。我们这里将使用schedule(TimerTask task,long time,long internal)方法来说明如何使用它。

    使用Java中的Timer和TimerTask
    -------------------------
    下面直接提供应用程序的源代码,有得时候感觉说的太多,对初学者作用并不是很大。但是当把代码给他们看了以后,很容易就接受了。下面我要完成的任务就是每隔3秒钟从一个文件中把内容读出来并打印到控制台,文件的内容如下:
    ming.txt
    hello world
    beijing
    basketball
    java
    c/c++
    这里涉及到一些IO的知识,但并不复杂。我们使用BufferedReader从文件里面读取内容,一行一行的读取,代码如下:

    try
    {
    BufferedReader br = new BufferedReader(new FileReader("ming.txt"));
    String data = null;
    while((data=br.readLine())!=null)
    {
    System.out.println(data);
    }
    }
    catch(FileNotFoundException e)
    {
    System.out.println("can not find the file");
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }
    在主程序中我们启动timer让他开始执行读取文件的工作。整个程序的内容如下
    import java.util.*;
    import java.io.*;

    public class TimerUse
    {
    public static void main(String[] args)
    {
    PickTask pt = new PickTask();
    pt.start(1,3);
    }
    }

    class PickTask
    {
    private Timer timer;

    public PickTask()
    {
    timer = new Timer();
    }

    private TimerTask task = new TimerTask()
    {
    public void run()
    {

    try
    {
    BufferedReader br = new BufferedReader(new FileReader("ming.txt"));
    String data = null;
    while((data=br.readLine())!=null)
    {
    System.out.println(data);
    }
    }
    catch(FileNotFoundException e)
    {
    System.out.println("can not find the file");
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }

    }
    };

    public void start(int delay,int internal )
    {
    timer.schedule(task,delay*1000,internal*1000);
    }

    }

    程序的输出结果为:

    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.

    C:\>java TimerUse
    hello world
    beijing
    basketball
    java
    c/c++
    hello world
    beijing
    basketball
    java
    c/c++
    hello world
    beijing
    basketball
    java
    c/c++
    hello world
    beijing
    basketball
    java

  • 相关阅读:
    CloudFoundry 中的GoRouter性能測试
    Android-SharedPreferences
    Oracle 闪回表实验
    使用Jfree实现吧条形图,java代码
    ZOJ Monthly, October 2010 ABEFI
    熟知CDN
    看,2015阿里巴巴视觉设计人员面临的问题招收学校
    于win7使用虚拟磁盘隐藏文件
    2015广东工业大学ACM学校巡回赛 I 游戏高手 (如压力dp)
    spring mvc 错误摘要--。位。
  • 原文地址:https://www.cnblogs.com/pony/p/1293963.html
Copyright © 2011-2022 走看看