다 알고 있는 내용이겠지만, 위 코드는 쓰레드가 1초동안 일시 정지 되게 한다.
간단한 내용이지만 처음에 오해했던 내용이여서 따로 정리해봤다.
public class Main {
public static void main(String[] args) {
TestThread thread = new TestThread();
thread.start();
try {
thread.sleep(10000); // 10초 정지
System.out.println("main에서 호출되었다!");
}catch (Exception e)
{
e.printStackTrace();
}
}
}
class TestThread extends Thread
{
public void run()
{
System.out.println("TestThread 에서 호출되었다!");
}
}
main 메서드의 작업을 수행하는 것도 쓰레드이며 이것을 main 쓰레드라고 한다.
사실상 지금 main 쓰레드 내에서 TestThread 쓰레드를 실행(start)를 하고 있는 것이다.
현재 쓰레드는 main 쓰레드, TestThread 쓰레드 2개가 동시에 실행 중이며
먼저 TestThread 쓰레드를 정지 시키기 위해서 thread.sleep(10000) 코드를 작성했다.
그러면 TestThread가 정지 되었으니 바로 다음 코드인
System.out.println("main에서 호출되었다!") 가 출력되어
'main에서 호출되었다!' 메시지가 출력 될거라 생각했는데 아니였다.
내가 정지시킨 쓰레드 run 메서드 내에 있는 "TestThread 에서 호출되었다!" 가 먼저 출력되고 10초 뒤에
main에서 호출되었다! 이 출력 되었다.
..
"TestThread 에서 호출되었다!"
(10초뒤)
main에서 호출되었다!
코드로 보기에 생각과 다른 순서이다.
그래서 보통 sleep() 메서드를 사용할 때는 static 메서드인 Thread.sleep() 이런식으로 사용한다.
thread.sleep(10000); 의 코드는 main 쓰레드 내에 있기 때문에 main 쓰레드에게 동작한다.
그래서 main 쓰레드가 10초 멈추게 되고 먼저 TestThread 클래스 내에 있는 run 메서드 내용이 출력되게 된다.
public class Main {
public static void main(String[] args) {
TestThread thread = new TestThread();
thread.start();
try {
System.out.println("main에서 호출되었다!");
}catch (Exception e)
{
e.printStackTrace();
}
}
}
class TestThread extends Thread
{
public void run()
{
try{
Thread.sleep(10000);
System.out.println("TestThread 에서 호출되었다!");
}catch (Exception e)
{
e.printStackTrace();
}
}
}
위 처럼 TestThread run 메서드 내에 sleep는 TestThread가 실행되면 해당 쓰레드를 중지 시킨다.
그래서 출력 결과는 반대가 되게 된다.
먼저 TestThread 는 10초간 정지하게 되고
main 메서드 내용이 먼저 출력 된다. 그리고 main 쓰레드는 종료되고
10초뒤에 TestThread 내용이 화면에 출력된다.
그리고 TestThread 쓰레드도 종료된다.