W jakim stanie znajduje się wątek wstrzymany na semaforze?
W jakim stanie znajduje się wątek wstrzymany na semaforze?
Odpowiedź na to pytanie może dostarczyć następujący program:
import java.util.concurrent.Semaphore; public class TestThreadState { public static void main(String[] args) { // tworzymy wątek roboczy Thread watek = new Thread(new Runnable() { @Override public void run() { Semaphore semafor = new Semaphore(0); // semafor z 0 liczbą przepustek try { semafor.acquire(); // wątek zostanie zatrzymany na semaforze } catch (InterruptedException e) { e.printStackTrace(); } } }); watek.setDaemon(true); // wątek zostanie zakończony automatycznie // gdy skończy działanie wątek główny watek.start(); // dodajemy opóźnienie, aby wątek roboczy miał czas dotrzeć do semafora try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(watek.getState()); } }
W wyniku wykonania programu otrzymamy odpowiedź: WAITING
Tak więc jest to ten sam stan w jakim może się znaleźć wątek po wykonaniu takich metod jak: join(), czy wait() (ta ostatnia musi być wywołana z poziomu kodu synchronizowanego).
Nb. wątek może znaleźć się w tym stanie także na skutek oczekiwania na wymianę danych za pomocą przekaźnika (klasa java.util.concurrent.Exchanger).