Salve Galera,
Estou esboçando uma aplicação com várias threads concorrentes, comandadas por um Singleton. Fui fazer um profiling no meu programa usando o TPTP e descobri que algumas threads estão sendo bloqueadas, e não faço a menor idéia do porquê.
Segue trecho de código do Singleton, responsável por gerenciar as threads concorrentes:
private Queen() {
workList = new CopyOnWriteArrayList<String>(.......);
activeWorkers = new CopyOnWriteArrayList<Worker>();
jobDone = new CopyOnWriteArrayList<String>(.....);
.
.
.
.
}
public void run(){
for(int i=0; i<CONCURRENT_JOBS; i++) {
startJob();
}
}
private void startJob() {
if(workList.size()>0) {
String job = workList.get(0);
Logger.getInstance().println("Starting job: " + job);
Worker worker = new Worker(job);
Thread thread = new Thread(worker);
thread.setName("_" + job);
thread.start();
activeWorkers.add(worker);
workList.remove(job);
} else {
if(activeWorkers.size() + haltedWorkers.size() == 0){
Logger.getInstance().println("Queen Job Done");
WorkStatusManager.getInstance().removeFiles();
jobFinished = true;
}
}
}
protected void jobDone(Worker workDone) {
Logger.getInstance().println("Job Done: " + workDone.getWork());
jobDone.add(workDone.getWork());
activeWorkers.remove(workDone);
startJob();
}
Quando uma Thread worker termina, ela invoca o método jobDone do singleton. No ThreadProfiler do TPTP, eu vejo umas 4-5 threads (o total varia em cada execução) bloqueadas, com a seguinte info:
Thread Name: _AS
Call Stack: logic.Worker.run(void()) line : 39
Blocked by Thread _IK
A thread _IK é mostrada como running, sem Call Stack. Não entendo muito de TPTP, então posso ter entendido errado a informação, mas o código que eu descrevi acima pode causar bloqueio indeterminado das minhas Threads Worker? As 4-5 que mencionei nunca saem do estado Blocked.
Obrigado a todos!