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