Leetcode Java Print Zero Even Odd
업데이트:
문제
코드
class ZeroEvenOdd {
private int n;
private Semaphore zeroSemaphore;
private Semaphore evenSemaphore;
private Semaphore oddSemaphore;
public ZeroEvenOdd(int n) {
this.n = n;
this.zeroSemaphore = new Semaphore(1);
this.evenSemaphore = new Semaphore(0);
this.oddSemaphore = new Semaphore(0);
}
// printNumber.accept(x) outputs "x", where x is an integer.
public void zero(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= this.n; i++) {
this.zeroSemaphore.acquire();
printNumber.accept(0);
if (i % 2 == 0) {
this.evenSemaphore.release();
} else {
this.oddSemaphore.release();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= this.n; i += 2) {
this.evenSemaphore.acquire();
printNumber.accept(i);
this.zeroSemaphore.release();
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= this.n; i += 2) {
this.oddSemaphore.acquire();
printNumber.accept(i);
this.zeroSemaphore.release();
}
}
}
결과
설명
-
세 개의 쓰레드가 각각 0을 출력하는 zero, 홀수를 출력하는 odd, 짝수를 출력하는 even 메서드를 비동기로 호출할 때, n까지 0 출력 이후 홀수와 짝수를 순차적으로 출력하는 문제이다.
- 문제 풀이에 필요한 전역 변수를 정의한다.
- n은 출력되는 최대값을 저장할 변수이다.
- zeroSemaphore, evenSemaphore, oddSemaphore은 순차적으로 0과 짝수, 홀수를 출력하기 위한 순서를 제어하기 위한 변수이다.
- 생성자인 ZeroEvenOdd(int n)를 정의한다.
- n을 전역 변수 n에 넣어준다.
- zeroSemaphore는 permits를 1로, evenSemaphore와 oddSemaphore는 0인 Semaphore 객체로 초기화한다.
- 메서드인 zero(IntConsumer printNumber)를 정의한다.
- 10부터 n 이하까지 i를 증가시키며 아래를 반복한다.
- zeroSemaphore를 잠궈준다.
- printNumber를 0으로 수행하여, 0을 출력해준다.
- i가 짝수이면 evenSemaphore를, 홀수이면 oddSemaphore를 release하여 잠금을 해제해준다.
- 10부터 n 이하까지 i를 증가시키며 아래를 반복한다.
- 메서드인 even(IntConsumer printNumber)을 정의한다.
- 2부터 n 이하까지 i를 2씩 증가시키며 아래를 반복한다.
- evenSemaphore를 잠금 후 printNumber를 i로 수행하여, i를 출력해준다.
- zeroSemaphore를 release하여 잠금을 해제하여 다음 수행을 진행하게 해준다.
- 2부터 n 이하까지 i를 2씩 증가시키며 아래를 반복한다.
- 메서드인 odd(IntConsumer printNumber)를 정의한다.
- 1부터 n 이하까지 i를 2씩 증가시키며 아래를 반복한다.
- oddSemaphore를 잠금 후 printNumber를 i로 수행하여, i를 출력해준다.
- zeroSemaphore를 release하여 잠금을 해제하여 다음 수행을 진행하게 해준다.
- 1부터 n 이하까지 i를 2씩 증가시키며 아래를 반복한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기