Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于定时器实用程序_Java_Timer - Fatal编程技术网

Java 关于定时器实用程序

Java 关于定时器实用程序,java,timer,Java,Timer,我正在开发一个类,该类将安排一项任务,如果该任务耗时超过2分钟,则我将显示一条消息,说明任务已强制完成,因为任务耗时超过2分钟,如果任务在2分钟内或之前完成,则我将显示一条消息,说明任务在2分钟之前完成,现在的挑战是,我想要一个虚拟任务,比如说一个循环来测试它,请建议如何实现它,下面是我迄今为止尝试过的代码 import java.util.Timer; import java.util.TimerTask; public class Reminder { Timer timer;

我正在开发一个类,该类将安排一项任务,如果该任务耗时超过2分钟,则我将显示一条消息,说明任务已强制完成,因为任务耗时超过2分钟,如果任务在2分钟内或之前完成,则我将显示一条消息,说明任务在2分钟之前完成,现在的挑战是,我想要一个虚拟任务,比如说一个循环来测试它,请建议如何实现它,下面是我迄今为止尝试过的代码

import java.util.Timer;
import java.util.TimerTask;

public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
   }

    class RemindTask extends TimerTask { // Nested Class
        public void run() {
             //hOW TO SET THE any kind of task which takes more than 5 minutes any loop or any sort of thing
        //   If elapsed time is > 50 minutes, something is not right
            System.out.format("Time's up since it takes more than 5 minutes....!%n");
            timer.cancel(); //Terminate the timer thread
        }
    }

    public static void main(String args[]) {
        new Reminder(5);
        System.out.format("Task scheduled.%n");

    }
}

这将使您开始:

public abstract class LimitedTask {
    private final long timeOut;
    private final Timer timer;
    private final AtomicBoolean flag;

    protected LimitedTask(long timeOut) {
        this.timeOut = timeOut;
        this.timer = new Timer("Limiter",true);
        this.flag = new AtomicBoolean(false);
    }

    public void execute(){

       //---worker--
       final Thread runner = new Thread(new Runnable() {
           @Override
           public void run() {
               try{
                   doTaskWork();
               }catch (Exception e){
                   e.printStackTrace();
               }finally {
                   if(flag.compareAndSet(false,true)){
                       timer.cancel();
                       onFinish(false);
                   }
               }
           }
       },"Runner");

       runner.setDaemon(true);
       runner.start();

       //--timer--
       this.timer.schedule(new TimerTask() {
           @Override
           public void run() {

               runner.interrupt();

               if(flag.compareAndSet(false,true)){
                   onFinish(true);
               }
           }
       },this.timeOut);
    }

    public abstract void onFinish(boolean timedOut);

    public abstract void doTaskWork() throws Exception;

}
测试实施:

public class TestTask extends LimitedTask {
    public TestTask() {
        super(10000);
    }

    @Override
    public void onFinish(boolean timedOut) {
        System.out.println(timedOut ? "Task timed out" : "Task completed");
    }

    @Override
    public void doTaskWork() throws Exception {
        for (int i = 0; i <100 ; i++){
            Thread.sleep(1000);
        }
    }
}

你说的“我想要一个虚拟任务,让我们先说一个循环来测试它”是什么意思?@User11091981如果任务花费的时间更多,如果任务花费的时间更少,我想测试两个scnarios@奇点兄弟请张贴更新的代码,因为我已经做了@user1906154链接实际上正是您要查找的内容。在答案中查找“更新”代码。
TestTask t = new TestTask();
t.execute();