2016-08-03 4 views
1

Dies ist für Java Akka.Was passiert, wenn ein Runnable eines wiederkehrenden Akka-Schedulers länger dauert als die wiederkehrende Zeit?

Lassen Sie uns sagen, dass ich einen Scheduler Telefonierens:

... 
FiniteDuration interval = new FiniteDuration(30L, TimeUnit.SECONDS); 
actorSystem.scheduler().schedule(delay, interval, action, actorSystem.dispatcher()); 

wo action der Klasse ist SomeRunnable:

public class SomeRunnable implements Runnable { 
    @Override 
    public void run() { 
     Thread.sleep(60000); 
    } 
} 

So alle 30 Sekunden wird der Planer die Aktion ausgeführt, die für 60 schlafen Sekunden. Wenn ich den Code ausführe, scheint es so, als würde der erste Schlaf beendet, ein zweiter beginnt sofort. Was genau passiert hier? Warum passiert das?

Entschuldigung, wenn dies zu vage ist. Vielen Dank!

+1

Der Scheduler beendet seine endliche Zyklusdauer, aber er wartet auf den Abschluss seines vorherigen Threads. Daher wird sofort nach dem Ende des Schlafs der nächste Thread gestartet. Aber bitte erläutern Sie, was Sie erreichen möchten, Sie möchten den Scheduler alle 30 Sekunden ausführen, auch wenn der vorherige Thread nicht abgeschlossen ist? Oder möchten Sie nach jedem Thread 30 Sekunden warten? –

+0

Also nur zur Klarstellung, Sie sagen, dass der Scheduler warten wird, bis der vorherige Thread die Ausführung beendet hat, um den nächsten zu starten? Ich möchte den Scheduler alle 30 Sekunden ausführen, auch wenn der vorherige Thread nicht abgeschlossen ist. Wenn der vorherige Thread jedoch nicht abgeschlossen ist, möchte ich ihn beenden. –

Antwort

0

Sie können dies tun, indem Sie einen anderen Thread starten und den vorherigen Thread stoppen.

final Thread previousthread[]=new Thread[1]; 
    FiniteDuration interval = new FiniteDuration(30L, TimeUnit.SECONDS); 

    actorSystem.scheduler().schedule(Duration.Zero(), interval, new Runnable() { 

     @Override 
     public void run() { 
      System.out.println("next cycle"); 
      if(previousthread[0]!=null){ 
       try{ 
       previousthread[0].interrupt(); 
       System.out.println("previous thread stopped"); 
       }catch(InterruptedException e){ 
        // e.printStackTrace(); 
       } 
      } 
      Thread th = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        try{ 
         System.out.println("before sleep"); 
         Thread.sleep(60000); 

        // put your required code here 

         System.out.println("thread complete"); 
        }catch(Exception e){ 
         e.printStackTrace(); 
        } 

       } 
      }); 
      th.start(); 
      previousthread[0]=th; 

     } 
    }, actorSystem.dispatcher()); 
Verwandte Themen