Java/JUnit
[JUnit] Thread 상태를 테스트하기 (BLOCKED (대기)상태인지 검증하기)
2025. 3. 11. 00:37반응형
특정 스레드가 BLOCKED(대기) 상태인지 여부를 확인하는 방법은,
해당 스레드의 상태가 Thread.State.BLOCKED와 같은지 확인하면 된다.
즉, BLOCKED 상태인지를 체크하여 특정 스레드가 lock을 기다리는지를 확인할 수 있다.
아시다시피, BLOCKED 상태는 다른 스레드에 의해 획득된 lock을 기다리는 상태를 나타낸다.
Thread.state에 대한 정보를 더 알고 싶다면, 아래의 링크를 참고하는게 좋다. (https://developer.android.com/reference/java/lang/Thread.State)
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED
위와 같은 Thread의 State가 있다.
아래는 스레드 상태를 확인해보는 Test 코드 예제이다.
@Test
public void testMySynchronizedMethod() throws Exception {
final MySynchronizedClass mySyncTest = new MySynchronizedClass();
Thread threadA = new Thread(new Runnalble() {
@Override
public void run() {
mySyncTest.mySynchronizedMethod();
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
mySyncTest.mySynchronizedMethod():
}
});
// ThreadA 시작 - 이 스레드는 락을 획득하여 1초 대기하게 됩니다.
threadA.start();
// 잠깐 기다렸다가 ThreadB를 시작할 겁니다.
Thread.sleep(200);
// ThreadB 시작 - 이 스레드도 ThreadA가 가진 락을 기다리게 됩니다.
threadB.start();
// 잠깐 기다립니다.
Thread.sleep(200);
// threadB의 상태가 BLOCKED 상태일 겁니다.
assertEquals(Thread.State.BLOCKED, threadB.getState());
}
Class MySynchronizedClass {
synchronized void mySynchronizedMethod() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MySynchronizedClass
Class MySynchronizedClass {
synchronized void mySynchronizedMethod() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
먼저 ThreadA을 시작하고, 충분한 시간(200ms)을 대기하여 ThreadA이 락을 획득하게 합니다.
그 다음 ThreadB를 시작하고 충분한 시간(200ms) 을 대기하여 ThreadB가 락을 기다리게 합니다.
이 후, ThreadA가 가진 락을 ThreadB가 기다리게 되고, 이 ThreadB의 상태는 BLOCKED이 되게 됩니다.
참고자료
https://developer.android.com/reference/java/lang/Thread.State
반응형
'Java > JUnit' 카테고리의 다른 글
[JUnit] Exception 발생을 검증하기 / 발생하지 않는 걸 검증하기 (0) | 2025.03.11 |
---|---|
[Junit] @Before @After @BeforeClass @AfterClass, Junit4 어노테이션 정리 (0) | 2021.10.07 |