싱글쓰레드와 멀티쓰레드의 실행
[실행에서의 차이]
1. 싱글쓰레드는 순서대로 실행된다.
class ThreadTest{ // 싱글쓰레드 테스트
public static void main(String args[]){
for(int i=0 ; i<300 ; i++)
System.out.print(“a”);
for(int i=0 ; i<300 ; i++)
System.out.print(“b”);
}
}
// 결과
aaa...aaabbb...bbb // a가 300번 출력된 후 b가 300번 출력된다.
2. 멀티쓰레드는 OS스케줄러가 정한 순서에 따라 실행되며, 실행 시간도 스케줄러가 정한다.
// MyThread1의 run()
for(int i=0 ; i<300 ; i++)
System.out.print(“a”);
// MyThread2의 run()
for(int i=0 ; i<300 ; i++)
System.out.print(“b”);
class ThreadTest{ // 멀티쓰레드 테스트
public static void main(String args[]){
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
t1.start();
t2.start();
}
}
// 결과
aaaaabbbaaabb...bbbaaa // a과 b가 뒤섞여서 300개씩 출력된다.
3. 같은 작업을 싱글쓰레드와 멀티쓰레드로 각각 실행하면, 멀티쓰레드가 실행시간이 더 길다.
- 실행하는 쓰레드를 바꾸는 것을 context switching이라 하는데, 이때 실행하는 작업의 정보를 바꾸는 시간이 소요되어 싱글쓰레드보다 전체 실행시간이 더 길다.
- 위의 예시에서는 멀티쓰레드 테스트에서 a를 출력하다가 b로 바꾸고, 다시 a로 바꾸는 과정에서 싱글쓰레드 테스트보다 시간이 좀 더 걸리게 된다.
[쓰레드의 Input/Output 블로킹]
1. 싱글쓰레드에서 사용자에게 입력받기 + 10초 거꾸로 세기 실행
import javax.swing.JOptionPane;
// main()
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
for(int i=10 ; i>0 ; i--) {
System.out.println(i);
try { Thread.sleep(1000); // 1초간 시간을 지연한다.
}catch(Exception e) {}
}
2. 멀티쓰레드로 사용자에게 입력받기 + 10초 거꾸로 세기 실행
import javax.swing.JOptionPane;
// main()
ThreadEx th1 = new ThreadEx();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
// ThreadEx의 run()
for(int i=10 ; i>0 ; i--) {
System.out.println(i);
try { Thread.sleep(1000); // 1초간 시간을 지연한다.
}catch(Exception e) {}
}
3. 위의 두 예시의 결과
- 싱글쓰레드의 경우, "아무 값이나 입력하세요." 패널이 뜨고 사용자의 입력을 기다리는 동안 main 쓰레드는 블로킹당한다. 사용자가 입력을 해야 println()이 실행되고 그다음 10부터 1까지 출력되고 프로그램이 종료된다.
- 멀티쓰레드의 경우, "아무 값이나 입력하세요." 패널이 뜨고 사용자의 입력을 기다리는 동안 main 쓰레드는 블로킹당하고 그 사이에 th1 쓰레드가 실행된다. 입력을 하지 않아도 10부터 출력된다. 중간에 입력을 하면 println()이 실행되고 th1의 작업이 남아있다면 마저 출력을 하고 출력이 끝나면 프로그램이 종료된다.
- 이 경우에는 멀티쓰레드의 실행시간이 더 짧다.