2013-08-14 19 views
5

Non so quando dovrei usare Multithread nello sviluppo Java e la logica/ragione per usarlo. Come aiuta in diversi scenari?Quando/Perché dovrei usare Multithread in Java?

Scenario 1

Sto facendo un gioco a scorrimento in 2D con nemici e un tutto che, pensare metal slug

Scenario 2

Sto facendo un demone del database per controllare più database soddisfare.

Scenario 3

sto facendo una servlet per JSP, con alcune informazioni prelevato dalla banca dati.

Sentiti libero di modificare gli scenari per renderlo migliore.

Inoltre: dovrei usare il multithread per i server di gioco? O non dovrei?

+7

domanda troppo generica ... – Sebastian

+0

@Sebastian Bene .... Ho cercato un po 'e ho trovato questo, ma non ero soddisfatto dalla risposta. Così ho chiesto di nuovo in un modo che volevo che fosse. Se questa è troppo ampia, la domanda è questa: http://stackoverflow.com/questions/7419619/ –

+1

Credo che la domanda sia abbastanza specifica da poter essere rimossa dalla stasi. – supersam654

risposta

5

Non so quando dovrei usare Multithread nello sviluppo Java e la logica/ragione per usarlo. Come aiuta in diversi scenari?

È necessario modificare il programma per utilizzare i thread per un paio di motivi diversi.

  • Quando il programma funzionerebbe molto più velocemente e utilizzare meglio l'architettura CPU/core multiplo che si esegue su. Uso la parola "significativamente" perché spesso l'aggiunta di thread aggiunge molta complessità, quindi un miglioramento della velocità del 20% potrebbe non valerne la pena.

    Può essere difficile, tuttavia, determinare se il programma utilizzerà correttamente più processori in modo che la rielaborazione del programma sia un buon investimento. Solo se c'è un sacco di elaborazione/calcolo coinvolti otterrai un aumento di velocità. Se, ad esempio, il tuo programma è in attesa di IO (lettura o scrittura su disco o rete), potresti passare molto tempo a suddividere un programma in più thread solo per non vedere miglioramenti della velocità.

  • Quando ci sono più parti del programma che dovrebbero essere in esecuzione contemporaneamente. Non è che non potrebbe essere eseguito in un thread, ma farlo sarebbe più complicato. Ad esempio, un server Web ha più thread di gestione delle richieste, perché è più facile che ogni thread gestisca una singola richiesta, anche se non si può caricare una tonnellata di carico attraverso il server, in modo che più thread lo rendano più veloce.

Inoltre: la stessa domanda per le cose di J2EE, quando dovrei usare multithread nei miei servlet? O non dovrei?

Penso che le stesse risposte sopra si applicano. In generale i servlet sono attività molto piccole che sono progettate per tornare rapidamente, quindi è relativamente insolito per loro forgiare i thread. Tuttavia, se vi è un'attività di lunga durata che deve essere avviata da un servlet ma si desidera che restituisca un tipo di risposta "Starting job", sarà necessario un thread.

È importante notare che al momento dell'esecuzione del servlet, il gestore upstream probabilmente sta già utilizzando un pool di thread in modo da non dover fare nulla.


Edit:

Scenario 1 - Sto facendo un gioco a scorrimento in 2D con nemici e un tutto che, pensare metal slug

non ho un buon rispondere per questo. Dipende dal fatto che ci sia un sacco di rendering in corso e dipende da quali toolkit stai usando.

Scenario 2 - Sto creando un daemon di database per controllare più contenuti del database.

È probabile che si stia eseguendo il binding di un database in modo che più thread non possano darti nulla. Quindi, di nuovo, se si hanno query a lunga esecuzione, si potrebbe ottenere un miglioramento se le query brevi potrebbero essere eseguite in parallelo su altri thread. Ciò dipende anche da come il tuo database gestisce più connessioni.

Scenario 3 - Sto creando un servlet per JSP, con alcune informazioni recuperate dal database.

Se la risposta deve attendere il recupero delle informazioni, non vi è alcun motivo per farlo in un altro thread. Tuttavia, come ho detto sopra, se il servlet sta provando a biforcarsi una sorta di transazione di database che viene eseguita in background, dovresti usare una discussione.

Ancora una volta, la maggior parte dei contenitori servlet è già in esecuzione in un pool di thread.

+0

Quindi server come Tomcat si occupano automaticamente del multithreading giusto? –

+0

Right @Louie. Nel momento in cui viene chiamato il servlet, sono già utilizzati più thread. Li puoi vedere con jconsole. – Gray

1

Utilizzare Multi-Threading quando si può pensare che qualcosa può essere parallelizzato o può essere reso asincrono.

parallelized Ad esempio: Mentre la costruzione di web-crawler, è possibile avere le discussioni parallele che sfogliare diverse pagine, ecc Questo potrebbe anche significare meglio utilizzare le risorse (CPU, I/O, ecc)

asincrono nel senso , nel caso di produttore-consumatore in cui si ha un blocco di codice che produce roba e il resto lo consuma.

0

non so quando dovrei usare multithread in sviluppo Java

-Allora non si dovrebbe. Inoltre, se puoi evitarlo, fallo assolutamente.

Quando: un esempio: se è necessario recuperare i valori di quota di mercato di diversi titoli da più siti/risorse esattamente allo stesso tempo per aggiornare diversi sistemi di broker, potrebbe essere necessario come un singolo thread dovrà ottenere da un sito prima di provare a passare da quello successivo.

base dalla tua modifica nella vostra Question-

Secnario 1: Sto facendo un gioco a scorrimento in 2D con nemici e un tutto che, pensare di metal slug

Sì, è possibile . Un esempio potrebbe essere il caricamento delle risorse in un thread mentre si visualizza un "Caricamento in corso ..."L'animazione sullo schermo in un altro thread.

+0

In un momento in cui le guerre dei processori sono basate su core e non su hertz, penso che non sia saggio dire "se puoi evitarlo, fallo assolutamente". Sì, se usato in modo inappropriato o errato può causare un problema, ma ciò non Significa che dovrebbe essere evitato a tutti i costi. Il multithreading dovrebbe essere usato in modo responsabile. – digitaljoel

+0

@digitaljoel Mi hai sbagliato. La mia risposta si applica a coloro che iniziano con "Non so quando dovrei usare Multithread nello sviluppo Java", nel senso che sono ancora nuovi, e quando possono rispondere alla loro domanda, hanno studiato/ricercato abbastanza per sapere cosa hai detto. Ma ho dato esempi poiché OP voleva sapere quando usarlo. –

1

Non è proprio come te, una volta imparato il multithreading, quindi si utilizza tutto il tempo in tutto il mondo. Si utilizza il multithreading quando ne avete bisogno.

Per esempio si dispone di un lavoro lungo puoi fare e non vuoi bloccare l'interfaccia utente, puoi eseguire l'operazione su un altro thread mentre l'interfaccia utente funziona ancora.Questo sarebbe uno scenario

Un altro sarebbe calcolare qualcosa di complesso che può essere fatto in molti passaggi indipendenti, quindi potrebbe essere fatto in parallelo utilizzando il multithreading

0

Diciamo che avete un Nell'applicazione che è responsabile del download di un file, se non si utilizzano più thread, tutte le altre istruzioni attenderanno fino al termine del download del file. Ad esempio, Swing usa un thread speciale per visualizzare la sua GUI, quindi dai un'occhiata al tutorial this e leggi un po 'di concurrency