Ho iniziato a leggere di più su ThreadPoolExecutor da Java Doc mentre lo sto usando in uno dei miei progetti. Quindi qualcuno può spiegarmi cosa significa in realtà questa linea? - So cosa significa ciascun parametro, ma volevo comprenderlo in un modo più generale/personale da alcuni degli esperti qui.ThreadPoolExecutor con ArrayBlockingQueue
ExecutorService service = new ThreadPoolExecutor(10, 10, 1000L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10, true), new
ThreadPoolExecutor.CallerRunsPolicy());
Aggiornato: - problema dichiarazione è: -
Ogni thread utilizza ID univoco tra 1 e 1000 e il programma è di correre per 60 minuti o più, quindi in questo 60 minuti è possibile che tutti gli ID saranno finiti quindi ho bisogno di riutilizzare quegli ID di nuovo. Quindi questo è il programma qui sotto che ho scritto usando sopra l'esecutore.
class IdPool {
private final LinkedList<Integer> availableExistingIds = new LinkedList<Integer>();
public IdPool() {
for (int i = 1; i <= 1000; i++) {
availableExistingIds.add(i);
}
}
public synchronized Integer getExistingId() {
return availableExistingIds.removeFirst();
}
public synchronized void releaseExistingId(Integer id) {
availableExistingIds.add(id);
}
}
class ThreadNewTask implements Runnable {
private IdPool idPool;
public ThreadNewTask(IdPool idPool) {
this.idPool = idPool;
}
public void run() {
Integer id = idPool.getExistingId();
someMethod(id);
idPool.releaseExistingId(id);
}
// This method needs to be synchronized or not?
private synchronized void someMethod(Integer id) {
System.out.println("Task: " +id);
// and do other calcuations whatever you need to do in your program
}
}
public class TestingPool {
public static void main(String[] args) throws InterruptedException {
int size = 10;
int durationOfRun = 60;
IdPool idPool = new IdPool();
// create thread pool with given size
ExecutorService service = new ThreadPoolExecutor(size, size, 500L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(size), new ThreadPoolExecutor.CallerRunsPolicy());
// queue some tasks
long startTime = System.currentTimeMillis();
long endTime = startTime + (durationOfRun * 60 * 1000L);
// Running it for 60 minutes
while(System.currentTimeMillis() <= endTime) {
service.submit(new ThreadNewTask(idPool));
}
// wait for termination
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
}
Le mie domande sono: - Questo codice è giusto per quanto riguarda la Performance è considerato o no? E cos'altro posso farlo qui per renderlo più preciso? Qualsiasi aiuto sarà apprezzato.
Non vedo niente di sbagliato con il codice, diverso forse avere un try/finally nel metodo "run" per garantire che id sempre ottenere rilasciato (per quando si dispone di un codice più complicato "someMethod "). – Matt
@Matt, Grazie per aver commentato, Quindi someMethod deve essere sincronizzato? o no? Come nel mio caso l'ho reso sincronizzato. – ferhan
E 'idPool.releaseExistingId (id);' dovrebbe venire nel blocco finally giusto? – ferhan