2012-12-22 4 views
0

Je suis en train de développer une classe qui va planifier une tâche, et si cette tâche a pris plus de 2 minutes, je vais montrer un message que la tâche est terminée avec force. la tâche est terminée dans les 2 minutes ou avant que je montre le message que la tâche est terminée avant 2 minutes elle-même, maintenant le défi est que je veux une tâche fictive disons une boucle d'abord pour le tester, veuillez conseiller comment y parvenir, ci-dessous est le code que je l'ai essayé jusqu'à présent ..En ce qui concerne l'utilitaire de minuterie

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"); 

    } 
} 
+0

Qu'est-ce que vous vouliez dire par "Je veux une tâche fictive laisser dire une première boucle à tester"? – Mahendran

+0

@ User11091981 Je veux tester les deux scnarios si la tâche a pris plus de temps et si la tâche a pris moins de temps .. !! – user1906154

+2

http://stackoverflow.com/q/13309870/1531054 –

Répondre

1

Cela vous aider à démarrer:

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; 

} 

mise en œuvre du test:

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); 
     } 
    } 
} 

Run:

TestTask t = new TestTask(); 
t.execute();