Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 0

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).

 

 

 

  • Odpowiedział
  • @ | 12.01.2016
  • TRENER MODERATOR ALTKOM AKADEMII