2012-04-28 14 views
7

Nella concorrenza Java, cosa rende una stringa "attiva"? Solo il fatto che non sia al minimo? Un thread "in attesa" o "sospeso" è ancora considerato, tecnicamente, attivo?Cosa definisce un thread "attivo"?

+2

Qual è il contesto in cui appare "attivo"? È un termine troppo generico per fornire una definizione difficile con così poche informazioni. –

+0

"È generalmente accettabile disporre di 4-20 thread attivi per core". – IAmYourFaja

+0

Un thread 'java' attivo è un thread che * può * essere il thread di esecuzione attualmente in esecuzione. È un thread che ha lasciato lo stato "nuovo" e ha raggiunto (o riottenuto) lo stato "eseguibile". I thread attivi occupano la residenza nel pool di thread eseguibile. È un errore comune per il termine sensibile al contesto * attivo * da prendere come "il thread eseguibile attualmente in esecuzione". – 8bitjunkie

risposta

5

Da quello che posso dire il termine "attivo" sembra essere usato molto ma non mai definito. Il metodo ThreadGroup.enumerate() è documentata:

Copie nell'array specificato ogni thread attivo in questo gruppo di thread e suoi sottogruppi.

e da looking at the source for this, esso sta controllando il metodo Thread.isAlive() e aggiungendo quelle a enumerable. Da ciò deduco che i termini "attivo" e "vivo" sono intercambiabili e "vivo" è definito come:

Un thread è attivo se è stato avviato e non è ancora morto.

1

In questo contesto prendo "attivo" per indicare che stanno eseguendo il codice. Thread inattivi - quelli che sono bloccati su chiamate I/O o in attesa di lock - consumano solo risorse di memoria senza influenzare la CPU (o solo marginalmente).

Tuttavia, dipende davvero da cosa stanno facendo i tuoi thread. Se ogni thread sta iterando su numeri per calcolare i primi, sono completamente vincolati alla CPU, e in realtà si dovrebbe avere solo uno per core per massimizzare il throughput. Se stanno facendo richieste HTTP o eseguono l'I/O di file, puoi permetterti di avere abbastanza per core.

Alla fine, una dichiarazione generale che copre tutti i thread in generale senza riguardo per quello che stanno facendo è abbastanza inutile.

Consiglio vivamente il libro Java Concurrency in Practice per un trattamento di alta qualità dell'argomento della programmazione Java simultanea.

0

La parola "attivo" viene utilizzata in senso inglese normale qui.

Un normale significato inglese della parola attiva è "fare qualcosa". Quindi, un significato intuitivo di "attivo" per i thread è che in realtà sono in esecuzione o sono pronti per essere eseguiti.

Nel contesto di questa citazione:

"è generalmente accettabile per avere 4 - 20 fili attivi per core"

la parola "attivo" viene utilizzata coerentemente con questo , anche se dovrei cavillare con i numeri. (20 è piuttosto alto, IMO).

Tuttavia, direi che si tratta di una dichiarazione intenzionalmente vaga. Il dare via è l'uso della frase di donnola "è generalmente accettato" (piuttosto che citare fonti specifiche) e l'ampio intervallo ("4 - 20"). Quindi, potresti affermare che la parola "attivo" è un altro esempio di vaghezza intenzionale.

IMO, l'autore della citazione sta cercando di far notare in generale che "troppi thread sono cattivi" ... senza essere precisi su cosa sia "too many". Estrarre una guida più precisa legando ciò che intende con "attivo" è inutile.(E per essere chiari, non è possibile dire quanti "troppi" è ... in generale.)

1

Date un'occhiata a java.lang.Thread.State

In altri non Sistemi Java, attivo equivale a "RUNNABLE". Un task/processo/thread è attivo se è in grado di eseguire attivamente il codice. È sospeso se non lo è (blocco, ecc.)

Come ha detto Stephen C, active è usato più come inglese piuttosto che Java qui.

0

"È generalmente accettabile disporre di 4-20 thread attivi per core". - Adam Tannon

In questo senso penso che la parola significhi "ready to run" piuttosto che "vivo" o uno qualsiasi degli altri significati possibili. Ha senso non avere più di una manciata di thread sulla coda pronta, perché non si ottiene alcun valore per i thread in attesa e si contribuisce alla pianificazione e al sovraccarico dell'interruttore di contesto. D'altra parte, se si dispone di un numero inferiore di thread ready-to-run rispetto ai core, non si sta facendo uso della risorsa disponibile.

+0

http://stackoverflow.com/questions/3275210/what-is-the-thread-state-of-a-thread-after-thread-yield – andersoj

Problemi correlati