Суть назначения состоит в том, чтобы продемонстрировать, как поток может сигнализировать другому.Наиболее распространенный способ - использовать блокирующие очереди, но здесь сигнал не несет никакой информации, поэтому достаточно семафора.
Создать класс потока, параметризованный двумя семафорами: вход и выход:
class ThreadPrinter implements Runnable {
int counter;
Semaphore ins, outs;
ThreadPrinter(int counter, Semaphore ins, Semaphore outs) {
this.counter = counter;
this.ins = ins;
this.outs = outs;
}
@Override
public void run() {
for (int i = 0; i < 25; i++) {
ins.aquire(); // wait for permission to run
System.out.println("" + counter);
outs.release(); // allow another thread to run
counter += 2;
}
}
Создайте 2 Semaphore
s и передайте их двум потокам:
Semaphore a = new Semaphore(1); // first thread is allowed to run immediately
Semaphore b = new Semaphore(0); // second thread has to wait
ThreadPrinter tp1 = new ThreadPrinter(1, a, b);
ThreadPrinter tp2 = new ThreadPrinter(2, b, a);
Примечание. Семафоры a
и b
передаются в другом порядке.