2011-01-04 7 views
2

Quick Hinweis fertig sind: Java und Android Noob hier, ich bin offen für Sie mir zu sagen, ich bin dummLaufcode, wenn alle Threads Verarbeitung

Ich habe (so lange, wie Sie mir sagen, warum.) eine Android-Anwendung, die erfordert, dass ich mehrere Threads starte, die aus verschiedenen Klassen stammen, und erst dann zur nächsten Aktivität übergehe, wenn alle Threads ihre Arbeit erledigt haben. Ich möchte auch ein "failsafe" Timeout hinzufügen, wenn einer der Threads dauert zu lange (HTTP-Anfrage dauert zu lange oder so).

Ich suchte Stack Overflow und fand einen Beitrag, dass ich eine Klasse erstellen sollte, um zu halten eine laufende Summe von offenen Threads und dann einen Timer verwenden, um abzufragen, wenn alle Threads abgeschlossen sind.

Ich denke, ich habe eine Arbeitsklasse erstellt, um dies für mich zu tun, es ist noch nicht getestet, hat aber keine Fehler in Eclipse angezeigt.

Ist dies eine korrekte Implementierung? Gibt es APIs, die mir bewusst gemacht werden soll (wie Klassen in der Java oder Android-APIs, die anstelle der abstrakten Klassen an der Unterseite der Klasse verwendet werden könnten?)

package com.dmp.geofix.libs; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Timer; 
import java.util.TimerTask; 

public class ThreadMonitor { 

    private Timer timer = null; 
    private TimerTask timerTask = null; 
    private OnSuccess onSuccess = null; 
    private OnError onError = null; 

    private static ArrayList<Thread> threads; 

    private final int POLL_OPEN_THREADS = 100; 
    private final int TIMEOUT = 10000; 

    public ThreadMonitor() { 
     timerTask = new PollThreadsTask(); 
    } 

    public ThreadMonitor(OnSuccess s) { 
     timerTask = new PollThreadsTask(); 
     onSuccess = s; 
    } 

    public ThreadMonitor(OnError e) { 
     timerTask = new PollThreadsTask(); 
     onError = e; 
    } 

    public ThreadMonitor(OnSuccess s, OnError e) { 
     timerTask = new PollThreadsTask(); 
     onSuccess = s; 
     onError = e; 
    } 

    public void start() { 
     Iterator<Thread> i = threads.iterator(); 
     while (i.hasNext()) { 
      i.next().start(); 
     } 

     timer = new Timer(); 
     timer.schedule(timerTask, 0, POLL_OPEN_THREADS); 
    } 

    public void finish() { 
     Iterator<Thread> i = threads.iterator(); 
     while (i.hasNext()) { 
      i.next().interrupt(); 
     } 

     threads.clear(); 
     timer.cancel(); 
    } 

    public void addThread(Thread t) { 
     threads.add(t); 
    } 

    public void removeThread(Thread t) { 
     threads.remove(t); 
     t.interrupt(); 
    } 

    class PollThreadsTask extends TimerTask { 

     private int timeElapsed = 0; 

     @Override 
     public void run() { 
      timeElapsed += POLL_OPEN_THREADS; 
      if (timeElapsed <= TIMEOUT) { 
       if (threads.isEmpty() == false) { 
        if (onSuccess != null) { 
         onSuccess.run(); 
        } 
       } 
      } else { 
       if (onError != null) { 
        onError.run(); 
       } 
       finish(); 
      } 
     } 

    } 

    public abstract class OnSuccess { 
     public abstract void run(); 
    } 

    public abstract class OnError { 
     public abstract void run(); 
    } 

} 

Antwort

2

prüfen java.util .gleichzeitiges Paket. speziell Zukunft, FutureTask und ExecutorService FutureTask ermöglicht den Status der Operation unter Ausführung mit methid IstFertig()

Ich hoffe, das hilft

1

Alle Fäden sollten zu bekommen sein Callable implementieren und sie sollten zukünftige Aufgaben sein.

beginnen alle mit countdownlatch/CyclicBarrier sie alle zur gleichen Zeit

+0

Wäre die Implementierung nicht auf alle Threads aufrufbar und übergebe sie an FutureTask, damit sie den Code mehrmals aufrufen? Ich möchte nur warten, bis alles fertig ist, und dann eine einzige Methode aufrufen, einmal mit einem alternativen Code-Block (wenn einer der Threads ausläuft). – rich97

+0

Join kann nur verwendet werden, wenn einige Threads, die die Verarbeitung beendet haben, auf verbleibende Threads warten müssen. Wie kann man die Timeout-Sache für die anderen Threads überprüfen? – Rustum

+0

Join kann nur verwendet werden, wenn einige Threads, die die Verarbeitung beendet haben, auf verbleibende Threads warten müssen. Wie kann man die Timeout-Sache für die anderen Threads überprüfen? Fügen Sie einen weiteren Thread hinzu, der als Monitor-Thread fungiert, um zu überprüfen, ob Threads noch verarbeitet werden. Brechen Sie die Aufgaben ab, für die die Zeit nicht mehr ausreicht. Hinzufügen von Countdown-Latch garantiert, dass alle Aufgaben zur gleichen Zeit gestartet werden – Rustum

1

beginnen, um sicherzustellen, Wenn Sie die Anwendung zu verlassen beabsichtigen, den Code nach der Ausführung, Sie vielleicht einen Blick auf Runtime.getRuntime haben wollen () .addShutdownHook (Thread), um einen Thread anzugeben, der ausgeführt werden soll, wenn die Anwendung beendet wird.

+0

Dies ist in einer Android-Anwendung, als solche würde es eine "richtige" Android-Art der Ausführung von Code, wenn die Anwendung beendet. Welches wären die Callback-Methoden onPause() und onStop() in der Activity-Klasse. – rich97

Verwandte Themen