Paolovox ha scritto:
while(true){
if(t1.getState() == State.TERMINATED && t2.getState() == State.TERMINATED) break;
}
Non serve, è inutile e "pesante" (è un loop continuo che consuma CPU). Per attendere la terminazione di un thread c'è il join()
Paolovox ha scritto:
Map<Integer, List<String>> mappa = new HashMap<>();
Runnable r1 = () -> {
for(int i = lista.size()-1 ; i>(lista.size()/2) ; i--){
if(mappa.get(lista.get(i).length()) == null){
mappa.put(lista.get(i).length(), new ArrayList<>(Arrays.asList(lista.get(i))));
}
else{
mappa.get(lista.get(i).length()).add(lista.get(i));
}
}
};
Runnable r2 = () -> {
for(int i = 0 ; i<=(lista.size()/2) ; i++){
if(mappa.get(lista.get(i).length()) == null){
mappa.put(lista.get(i).length(), new ArrayList<>(Arrays.asList(lista.get(i))));
}
else{
mappa.get(lista.get(i).length()).add(lista.get(i));
}
}
};
È tutto parecchio
inappropriato. HashMap NON è thread-safe, quindi NON puoi usarlo banalmente da più thread. E non è solo quello il punto. Anche la lista (per ciascuna lunghezza) va trattata nell'ottica "concorrente" (e ArrayList NON è thread-safe).
E inoltre se una lista va aggiunta, perché la lunghezza non c'è ancora come chiave nella mappa, serve una "serializzazione" degli accessi, una mutua-esclusione insomma, perché altrimenti potresti avere una
race condition in cui i due thread cercano di fare il put di nuova lista per la stessa lunghezza.
Quindi, mi spiace, ma stai "ignorando" troppe cose sulla concorrenza e sul multi-threading.
Paolovox ha scritto:
Grazie e buon primo maggio
Eh sì ... con tutti i problemi che ci sono nel lavoro in Italia (e che anche io sto avendo ultimamente sul lavoro) ... buon Primo Maggio ... speriamo ...