Sto implementando un quicksort parellel come pratica di programmazione, e dopo che ho finito, ho letto la pagina di tutorial di Java su Executor, che suona come se potesse rendere il mio codice ancora più veloce. Sfortunatamente, mi stavo affidando a join() per assicurarmi che il programma non continuasse fino a quando tutto è stato ordinato. In questo momento sto usando:Attendi che finiscano tutti i thread in un Executor?
public static void quicksort(double[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
// threads is an AtomicInteger I'm using to make sure I don't
// spawn a billion threads.
if(threads.get() < 5){
// ThreadSort's run method just calls quicksort()
Future leftThread = e.submit(new ThreadSort(a, left, i-1));
Future rightThread = e.submit(new ThreadSort(a, i+1, right));
threads.getAndAdd(2);
try {
leftThread.get();
rightThread.get();
}
catch (InterruptedException ex) {}
catch (ExecutionException ex) {}
}
else{
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
}
Questo sembra funzionare bene, ma se corro e.shutdown() subito dopo che io chiamo il mio metodo Quicksort non ricorsivo(), ha un mucchio di RejectedExecutionExceptions, così Presumo che questo non funzioni come volevo.
Quindi, comunque, praticamente sto cercando di ottenere la stessa funzionalità leftThread.join(), ma con un esecutore, e la mia domanda è:
È questo il modo migliore per aspettare fino a quando tutti i thread sono fatti?
EDIT: Ok, ho capito perché ho avuto un sacco di errori dopo aver spento il mio Executor, era perché stavo chiamando questa funzione in un ciclo (per uniformare i tempi di esecuzione) e non creare un nuovo Executor .
ThreadPoolExecutors sono perfetti per il download di immagini, se non si desidera che 1000 thread congestionino l'interfaccia di rete. BTW Sono abbastanza sicuro che Android utilizzi gli Executor per gestire i loro ASyncTask dietro le quinte. – manmal