KuroKami69 ha scritto:
se ho capito bene getState() restituisce uno state sottoforma di enum no?
Sì. Quando hai dubbi di questo tipo, c'è una soluzione molto semplice: aprire la documentazione "javadoc" del framework per documentarsi.
KuroKami69 ha scritto:
quando un thread (miner) finisce di fare quanto deve, deve morire, quindi mi va bene vada in dead, per poi venire cancellato. quantomeno la versione per dilettanti prevederebbe questo. l'esercizio dice che la miniera ha a disposizione solo 3 minatori, quindi dovrei riutilizzare quelli creati.
Chiariamo una questione:
cosa vuoi riutilizzare? Il java.lang.Thread (detto meglio:
QUEL tal flusso di esecuzione)? O il Miner (che è solo il lavoro come Runnable)?
Il Miner non credo che puoi riutilizzarlo. O perlomeno, in teoria sì. Il punto è che per come ho visto nel tuo codice, tu passi il socket al costruttore del Miner. Quindi una istanza del Miner è "legata" a quella tal comunicazione verso il client con quello specifico socket.
Gli scenari sono principalmente due:
1) Ti va bene che un thread "muoia" dopo aver eseguito un singolo Miner. Quando il run() del Miner termina, il thread va in stato TERMINATED. A questo punto il java.lang.Thread NON lo puoi riutilizzare. Ne devi creare uno nuovo!
Quindi nel tuo array "pool", per ciascun elemento: se è null
oppure se non-null
E terminated, allora puoi creare un nuovo Thread da assegnare in quello slot dell'array. Se non è uno di questi due casi, allora c'è un Thread che sta eseguendo un lavoro, e non lo devi toccare.
Questa è la soluzione più semplice e veloce. Ma NON riutilizzi i flussi di esecuzione.
2) Vuoi riutilizzare un thread ("flusso") di esecuzione per la esecuzione di più Miner (Runnable, detto in generale). In questo caso, NON devi far "morire" subito il thread e non devi quindi testare se terminated.
In uno scenario del genere, il "lavoro" del thread è un grosso loop in cui la esecuzione del run() del tuo Miner è SOLO una piccola parte del lavoro.
In sostanza hai un ciclo del genere:
a) attendi di ricevere un "lavoro" (Runnable)
b) esegui il run() del Runnable
c) ripeti da a)
Ci sarebbero da considerare svariate cose:
- come attendere la ricezione di un lavoro, da parte di un altro thread
- come gestire le eccezioni se il run() del lavoro dovesse mai lanciare qualcosa
- come eventualmente gestire lo "shutdown" dei thread.
Ma sono tutte cose che si fanno, a patto di conoscere dei concetti essenziali sulla sincronizzazione.