Frudy
6k
2019-03-27 16:57:52 작성 2019-03-27 17:23:28 수정됨
1
217

TERMINATED된 쓰레드를 아는법이 궁금해요.


똑같은코드가 어제 잘되던게 오늘 안되는일은 있을수가없잖아요? 

근데 지금 상황이 딱 그래요.

getAllStackTrace();로 분명 TERMINATED된 쓰레드까지 출력이 잘 되다가 안되다가 해요.



public class MainThread 
{
	public static void main(String[] args) throws InterruptedException
	{
		Thread t1 = new Thread("t1");
		Thread t2 = new Thread("t2");
		Thread t3 = new Thread("t3");
		
		t1.start();
		t2.start();
		t3.start();
		
		Set<Thread> threads = Thread.getAllStackTraces().keySet();
		for(Thread thread : threads)
		{
			System.out.println("==================================");
			System.out.println("그룹의 정보 = " + thread.getThreadGroup());
			System.out.println("쓰레드 이름 = " + thread.getName());
			System.out.println("쓰레드 상태 = " + thread.getState());
		}
		System.out.println("==================================");
	}
}


이 똑같은 코드를 계속 실행하면요,


(콘솔화면 전체를 찍었어요)


위처럼 TERMINATED된게 2개만 나올때도있고,

TERMINATED된게 하나만 나올때도 있고,


아예 안나올때도, t1 t2 t3 다 나올때도 있고 그때그떄 다르네요.

(모두 동일한코드에서 실행만했어요)


자바 8 doc도 참고했는데, 

Returns a map of stack traces for all live threads.

라고 해요.


살아있는 쓰레드만 리턴한다니까,

원래 TERMINATED된 쓰레드는 반환되지않는뜻인거같은데 실제로 될때도있어요.


이렇게 자꾸 상황이 바뀌는이유가 뭘까요?


보통 이런건 getallstacktraces() not work 이런식으로 검색하면

stackoverflow같은데에 왜안되는지 이유같은게 잘 나오는경우가 많았어요 이전에는,


getAllStackTraces()는 초천재 프로그래머가 예전에 만들어준 메소드이기 때문에,

같은 조건이라면 모든상황에서 항상 일정한 결과가 나와야하는데 그렇지가않아요...

0
  • 답변 1

  • rezigrene
    1k
    2019-03-27 23:57:33 작성 2019-03-28 00:30:19 수정됨

    스레드 목록을 얻을 당시에는 살아있었는데 

    getState()까지 가기전에 죽어서 그렇습니다.


    위 출력코드이후 아래에 다시한번 쓰레드 목록을 얻는코드를 넣으시고 출력하시면 두번째출력에선 첫번째에서 

    TERMINATED된 것들은 목록에서 안보일 것입니다.


    추가로 각 스레드는 현재 컴퓨터 상태에따라 빨리실행될수도 늦게 실행될수도 있어 매번실행결과가 정확히 동일하진 않게 됩니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.