In che modo il multi-threading è diverso in un'applicazione Web basata su Java rispetto a un'applicazione Java autonoma


13

Sono abbastanza nuovo su Java e la mia esperienza è limitata alle applicazioni basate sul Web in esecuzione su un contenitore Web (nel mio caso Jboss).

Ho ragione nel dire che per le applicazioni Web il contenitore web si occupa del multi-threading? In tal caso, posso introdurre nuovi gradini in applicazioni basate sul Web? C'è qualche vantaggio nel farlo e in quale scenario si dovrebbe fare questo?


Fino a EE6 non dovrai usare discussioni; EE7 introduce Concurrency Utilities.
Ripristina Monica - M. Schröder il

Risposte:


20

Ho ragione nel dire che per le applicazioni Web il contenitore web si occupa del multi-threading?

La maggior parte dei server web (Java e altro, incluso JBoss) segue un modello "un thread per richiesta", ovvero ogni richiesta HTTP viene elaborata completamente da un solo thread. Questo thread spesso passa la maggior parte del tempo ad aspettare cose come richieste DB. Il contenitore Web creerà nuovi thread se necessario.

Alcuni server (principalmente nell'ecosistema Java Netty ) eseguono la gestione asincrona delle richieste, con un modello "un thread fa tutto" o qualcosa di più complesso. L'idea di base è che avere molti thread in attesa spreca risorse, quindi lavorare in modo asincrono può essere più efficiente.

In tal caso, posso introdurre nuovi gradini in applicazioni basate sul Web?

È possibile, ma dovrebbe essere fatto con molta attenzione, poiché errori (come perdite di memoria o sincronizzazione mancante) possono causare bug che sono molto difficili da riprodurre o far cadere l'intero server.

C'è qualche vantaggio nel farlo e in quale scenario si dovrebbe fare questo?

Bene, il vantaggio è che puoi fare cose in parallelo. Usare i thread per migliorare la pura velocità computazionale è qualcosa che non dovresti fare su un server web, poiché rallenterebbe la gestione di altre richieste. Questo genere di cose dovrebbe essere fatto su un server separato, probabilmente usando una sorta di coda di lavoro.

Uno scenario legittimo per il multithreading nel contesto della gestione di una richiesta HTTP potrebbe essere se è necessario accedere ad altre risorse di rete, ad esempio chiamare diversi servizi Web diversi. Se lo fai in un singolo thrad, devi aspettare che ogni chiamata finisca a sua volta. Ma se si utilizzano più thread, il tempo di attesa totale è solo il ritardo della singola chiamata più lenta.


3
Ha senso. ExecutorService Interface è il modo migliore per creare nuovi thread in un'applicazione Web?
kapricanon,

4
@kapricanon: sì, a meno che tu non abbia alcuni requisiti specifici che non è in grado di gestire o il tuo server web ha già qualcosa di simile.
Michael Borgwardt,

2

In risposta alla tua domanda:

In che modo il multi-threading è diverso in un'applicazione Web basata su Java rispetto a un'applicazione Java autonoma

Non è diverso. Di solito le applicazioni web software su cui si basano forniranno già alcuni thread multipli trasformando ogni nuova richiesta in un thread. Puoi usare / creare discussioni proprio come faresti con qualsiasi altra applicazione.

Infatti, il multi-threading può darti aumenti drastici delle prestazioni se lo usi correttamente. Per attività di I / O intense come l'accesso alla rete e l'accesso all'unità disco, l'incremento delle prestazioni è quasi sempre garantito. Per le attività di elaborazione intensiva è necessario attenersi alla regola di un thread per core nel server. Ad esempio, se il tuo core ha un processore i7, dovresti attenersi a 7 thread per eseguire attività di calcolo.

In risposta alla tua domanda:

C'è qualche vantaggio nel farlo e in quale scenario si dovrebbe fare questo?

Michael Borgwart dice che non dovresti farlo per migliorare la velocità di calcolo. Non sono d'accordo, poiché questo articolo suggerisce che il multi-threading può aiutare a fornire reattività quando gli utenti hanno bisogno di un compito pesante dal punto di vista computazionale. In parole povere, gli utenti non dovranno attendere il tempo necessario per completare attività pesanti dal punto di vista computazionale con il multi-threading.

Se hai intenzione di usare molto i thread, ti suggerisco di usare un pool di thread. Ciò ridurrà il sovraccarico della creazione di thread.


come risponde alla domanda posta?
moscerino

1
Le risposte dovrebbero essere meritate. Se vuoi commentare, devi prima guadagnare 50 punti reputazione.
ChrisF

1

Bene, questa è una bella domanda e penso che la maggior parte degli sviluppatori che lavorano nello sviluppo di applicazioni web non usi esplicitamente il multithreading. Il motivo è abbastanza ovvio poiché si utilizza un server delle applicazioni per distribuire l'applicazione, il server delle applicazioni gestisce internamente un pool di thread per le richieste in arrivo.

Allora perché usare il multithreading esplicitamente? Qual è la necessità che uno sviluppatore di applicazioni web si esponga al multithreading?

Quando lavori su un'applicazione su larga scala in cui devi gestire molte richieste contemporaneamente, è difficile soddisfare ogni tipo di richiesta in modo sincrono perché un particolare tipo di richiesta avrebbe potuto eseguire molte elaborazioni che potrebbero ridurre le prestazioni dell'applicazione.

Facciamo un esempio in cui un'applicazione Web dopo aver fornito un particolare tipo di richiesta deve notificare agli utenti tramite e-mail e SMS. Farlo in modo sincrono con il thread della richiesta potrebbe ridurre le prestazioni dell'applicazione Web. Quindi ecco che arriva il ruolo del mutlithreading. In tali casi è consigliabile sviluppare un'applicazione multithread autonoma sulla rete che è responsabile dell'invio di e-mail e SMS.


perché questa risposta è sottovalutata?
Anurag Sharma,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.