Einfache Thread-Verwaltung - Java - Android
Ich habe eine Anwendung, die erstellt einen neuen thread, wenn ein user fragt nach einem Bild gefiltert werden.
Dies ist die einzige Art von Aufgabe, die ich habe und alle sind gleich wichtig.
Wenn ich Frage zu viele gleichzeitige threads (Max, die ich jemals wollen, ist 9) der thread-manager wirft einen RejectedExecutionException.
In der minute, was ich zu tun ist;
//Manage Concurrent Tasks
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>();
@Override
public int remainingSize() {
return tasks.size();
}
@Override
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) {
try{
task.execute(currentThumbnail);
while(!tasks.isEmpty()){
task = tasks.remove();
task.execute(currentThumbnail);
}
} catch (RejectedExecutionException r){
Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue");
tasks.add(task);
}
}
Fügen Sie einfach die abgelehnt task in eine Warteschlange und das nächste mal ein thread gestartet wird die Warteschlange überprüft, um zu sehen, ob es zu einem Rückstau.
Die offensichtliche Problem mit diesem ist, dass, wenn die Letzte Aufgabe wird abgelehnt, beim ersten Versuch es wird nie neu gestartet werden (Erst, nachdem es nicht mehr gebraucht wird).
Nur Fragen, wenn es ein einfaches Modell, das ich verwenden sollte, die für die Verwaltung dieser Art der Sache. Ich brauche Aufgaben zu informieren, die Warteschlange, wenn Sie fertig sind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Grund für die
RejectedExecutionException
ist, weilAsyncTask
implementiert einen thread-pool der eigenen (pro Mr. Martelli ' s Antwort), aber eine, die ist begrenzt auf maximal 10 gleichzeitige Aufgaben. Warum haben Sie diese Grenze, ich habe keine Ahnung.Daher, eine Möglichkeit ist, dass Sie zu Klonen
AsyncTask
, Erhöhung der Grenze (oder gehen Sie Grenzenlos, das ist auch möglich mitLinkedBlockingQueue
), und verwenden Sie Ihr Klon. Dann, vielleicht, bestätigen die änderung als patch zuAsyncTask
für zukünftige Android-Versionen.Klicken Sie auf hier zum ausführen einer Google-Code-Suche für
AsyncTask
-- der erste Treffer sollte die Umsetzung.Wenn Sie nur wollen, um die Erhöhung der Grenze, passen
MAXIMUM_POOL_SIZE
so groß sein wie Sie wahrscheinlich benötigen. Wenn Sie möchten, gehen Grenzenlos, verwenden Sie die null-argumentLinkedBlockingQueue
Konstruktor statt, die derzeit verwendet. AFAICT, der rest des Codes wahrscheinlich die gleiche bleibt.Scheinen Sie implementiert eine version des Thread-Pool design pattern -- der wikipedia-Artikel verweist auf viele hilfreiche Artikel über das Thema, das kann Ihnen helfen, zu verfeinern Ihre Umsetzung. Ich empfehle auch diese Java-spezifische Artikel, der eindeutige code und Erklärung.
Vielleicht eine option ist, um die Aufgabe warten auf eine blockierende queue (bitmaps) statt bitmap als parameter, aber Sie haben, um einen Weg für die Aufgabe(N) zu beenden.