2013-01-22 21 views
5

Nie jestem bardzo jasny na temat koncepcji semaforów w Javie i próbuję go zrozumieć.Semafory i Threadpools w Javie

Moje zrozumienie po przeczytaniu Oracle Docs (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html) i kilku innych stron, jest podobne do blokuj za pomocą liczby zezwoleń.

Zazwyczaj służy do tworzenia pul zasobów. Tutaj się mylić, istnieje również ThreadPoolExecutor, który może dać mi pulę wątków. Jaka jest różnica? Który z nich jest używany w jakim scenariuszu?

Odpowiedz

1

A ThreadPool to pula jednego lub więcej wątków, którymi można zarządzać zbiorowo. W Javie ThreadPoolExecutor ma również kolejkę, podczas gdy dajesz Runnable lub Callable do wykonania i można zwrócić Future, która pozwala kontrolować zadanie lub uzyskać wynik.

Semafor pozwala tylko na uzyskanie wielu pozwoleń, np. może maksymalnie dwa wątki uruchomić jakiś kod. Potrzebujesz wielu wątków, by nadać temu cel, ale poza tym nie są powiązane.

BTW: Czytałbym dokumentację dla Javy 7, ponieważ Java 5.0 była od jakiegoś czasu EOLem, a Java 6 prawie zakończyła działanie.

+0

Dzięki za wskazanie dla dokumentów Java 7. Właśnie googlowałem i otworzyłem link. – mehta

+0

Google jest trochę nieaktualny dla linków. Często daje ci 1.4.2. –

+1

Wyszukiwarka Google: "Java 7 XXX" z XXX = nazwa klasy działa w 99% przypadków. Na przykład: [wyszukaj Java 7 Semaphore] (https://www.google.co.uk/search?q=java+7+semaphore). – assylias

4

Przede wszystkim, nie ma czegoś takiego jak głupie pytanie ...

Semaphore pozwala wielu wątków do „zdobyć” zasób. Powinni sprawdzić, czy zasób jest dostępny. To jak zawór do kontroli przepływu.

A Lock jest do wyłącznego dostępu. Tylko jeden wątek na raz.

Pozwala na uruchomienie kodu (Runnable lub Callable) przy użyciu ograniczonej ilości wątków Nie musisz zawracać sobie głowy budowaniem tego samodzielnie, jest już zaimplementowany dla Ciebie w interfejsie API JSE. Możesz zrobić własne z semaforami i kolejkami ... ale jeśli nie masz dobrego powodu, nie trać czasu.

Obrazowanie trzeba zaimplementować serwer WWW, który otrzymuje pewne żądanie na port 80. Nie chcesz używać tego samego wątku, który nasłuchuje na tym porcie w celu przetworzenia całego żądania (jest to strata zasobów ...) . Możesz użyć umowy ThreadPoolExecutor z żądaniem, przetworzyć je i odpowiedzieć klientowi. ThreadPoolExecutor można skonfigurować tak, aby wykorzystywał bieżące procesory: optymalną liczbę zagrożeń dla tej architektury i tego zadania.

Concurrency in practice to fajna książka, dzięki której możesz pogłębić swoją wiedzę na ten temat.

Mam nadzieję, że pomogę ci i przepraszam za mój podstawowy angielski.

Powiązane problemy