2013-01-22 19 views
5

Non sono molto chiaro sul concetto di semafori in Java e sto cercando di capirlo.Semafori e threadpool in Java

La mia comprensione dopo aver letto i documenti di oracle (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html) e alcune altre pagine, è simile a un bloccare con un conteggio del numero di permessi.

Viene in genere utilizzato per creare pool di risorse. Qui mi confondo, c'è anche ThreadPoolExecutor che può darmi un pool di thread. Quindi qual è la differenza? Quale viene utilizzato in quale scenario?

risposta

1

Un ThreadPool è un pool di uno o più thread che possono essere gestiti collettivamente. In Java ThreadPoolExecutor ha anche una coda mentre gli si dà Runnable o Callable da eseguire e può restituire un Future che consente di controllare l'attività o ottenere un risultato.

Un semaforo consente semplicemente di ottenere un numero di permessi, ad es. può consentire al massimo due thread di eseguire codice. Hai bisogno di un numero di thread in esecuzione per dargli uno scopo, ma per il resto non sono correlati.

BTW: Vorrei leggere la documentazione per Java 7 in quanto Java 5.0 è stato EOL da qualche tempo e Java 6 è quasi alla fine del servizio gratuito.

+0

Grazie per indicare i documenti java 7. Ho solo cercato su Google e apro il link. – mehta

+0

google è un po 'obsoleto per i collegamenti. Spesso ti dà 1.4.2. –

+1

Ricerca Google: "Java 7 XXX" con XXX = nome della classe funziona il 99% delle volte. Ad esempio: [ricerca di Java 7 Semaphore] (https://www.google.co.uk/search?q=java+7+semaphore). – assylias

4

Prima di tutto, non c'è cosa come domanda stupida ...

Semaphore permette più thread per "acquisire" una risorsa. Dovrebbero controllare se la risorsa è disponibile. È come una valvola per il controllo del flusso.

A Lock è per l'accesso esclusivo. Solo un thread alla volta.

A ThreadPoolExecutor consente di eseguire codice (classe Runnable o Callable) utilizzando una quantità limitata di thread. Non devi preoccuparti di crearlo da solo, è già implementato per te nell'API di JSE. Potresti fare da te con alcuni semafori e code ... ma se non hai una buona ragione non perdere tempo.

Imaging è necessario implementare un server Web che riceve alcune richieste alla porta 80. Non si desidera utilizzare lo stesso thread che sta ascoltando questa porta per elaborare l'intera richiesta (questo è uno spreco di risorse ...) . È possibile utilizzare un deal ThreadPoolExecutor con la richiesta, elaborarlo e rispondere al client. ThreadPoolExecutor può essere configurato per sfruttare le CPU attuali: numero ottimale di minacce per questa architettura e questa attività.

Concurrency in practice è un bel libro per migliorare le tue conoscenze in materia.

Spero che questo ti aiuti e mi dispiace per il mio inglese di base.

Problemi correlati