start() 와 run()의 차이
start() | run() |
새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 첫 번째로 올라가게 한다. |
main 메서드에서 run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것일 뿐. |
main메서드에서 run()을 호출했을 때의 호출스택
새로운 쓰레드를 생성하고 start()를 호출한 후 호출스택의 변화
run()으로 실행
package chap13;
public class ThreadEx1 {
public static void main(String[] args) {
ThreadEx1_1 ex1_1 = new ThreadEx1_1();
ThreadEx1_2 ex1_2 = new ThreadEx1_2();
ex1_1.run(); // run으로 실행하면 한가지 작업이 모두 끝난 후에 다음 작업을 한다.
new Thread(ex1_2).start(); // 새 쓰레드가 시작할 때 러너블객체를 담아서 실행
}
}
class ThreadEx1_1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("0");
}
}
}
class ThreadEx1_2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("1");
}
}
}
결과
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000111111111111111
111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111
+
- 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다.
- 하나의 쓰레드에 대해 start()가 한 번만 호출될 수 있다.
- 쓰레드의 작업을 한 번 더 수행해야 한다면 새로운쓰레드를 생성한 다음에 srart()를 호출해야한다.
- 하나의 쓰레드에 대해 start()를 두 번 이상 호출하면 실행시에 "IllegalThreadStateException" 발생
package chap13;
public class ThreadEx1 {
public static void main(String[] args) {
ThreadEx1_1 ex1_1 = new ThreadEx1_1();
ThreadEx1_2 ex1_2 = new ThreadEx1_2();
ex1_1.start();
ex1_1.start(); // 하나의 쓰레드는 한번 실행될 수 있고 새롭게 생성하지 않고 이렇게 두 번 실행하면 예외발생
// 예외 발생하면 본래 가동이 멈춰야하지만 다른 쓰레드 들은 구역이 달라서 다른건 그대로 실행
new Thread(ex1_2).start(); // 새 쓰레드가 시작할 때 러너블객체를 담아서 실행
}
}
class ThreadEx1_1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.print("0");
}
}
}
class ThreadEx1_2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.print("1");
}
}
}
결과
Exception in thread "main" 0000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000java.lang.IllegalThreadStateException
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000 at java.lang.Thread.start(Unknown Source)00
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
000
at chap13.ThreadEx1.main(ThreadEx1.java:11)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000
반응형