Sto utilizzando ExecutorService per la facilità del programma multithreading simultaneo. Prendere seguente codice:ExecutorService, metodo standard per evitare che la coda di attività si riempia troppo
while(xxx)
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
Future<..> ... = exService.submit(..);
...
}
Nel mio caso il problema è che presentare() non è il blocco se tutti NUMBER_THREADS sono occupati. La conseguenza è che la coda delle attività è inondata da molte attività. La conseguenza di ciò è che la chiusura del servizio di esecuzione con ExecutorService.shutdown() richiede anni (ExecutorService.isTerminated() sarà false per un lungo periodo di tempo). Il motivo è che la coda delle attività è ancora abbastanza piena.
Per ora la mia soluzione è quella di lavorare con i semafori per non consentire di avere a molte voci dentro la coda compito di ExecutorService:
...
Semaphore semaphore=new Semaphore(NUMBER_THREADS);
while(xxx)
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
semaphore.aquire();
// internally the task calls a finish callback, which invokes semaphore.release()
// -> now another task is added to queue
Future<..> ... = exService.submit(..);
...
}
Sono sicuro che ci sia una soluzione migliore più Encapsulated?
vedo. Ho trascurato un dettaglio su http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29. eccolo menzionato, che come standard viene usata una coda illimitata. –
l'ho provato. sfortunatamente la tua soluzione non blocca (come voglio) ma lancia una RejectedExecutionException. trovato anche: http://www.velocityreviews.com/forums/t389526-threadpoolexecutor-with-blocking-execute.html. i workaround presentati sembrano essere più complicati come esempio del mio semaforo, dannazione! –
questo non funziona a causa di RejectedExecutionException se la coda è piena – user249654