반응형

특정 스레드가 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

반응형