일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- string
- simulation
- database
- Counting
- java
- Class
- bit manipulation
- array
- dynamic programming
- Stack
- Tree
- Math
- 코테
- Matrix
- greedy
- Binary Tree
- 코딩테스트
- 파이썬
- two pointers
- hash table
- 구현
- Data Structure
- Number Theory
- implement
- 자바
- SQL
- Method
- Binary Search
- geometry
- sorting
- Today
- Total
코린이의 소소한 공부노트
싱글쓰레드와 멀티쓰레드의 실행 본문
[실행에서의 차이]
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의 작업이 남아있다면 마저 출력을 하고 출력이 끝나면 프로그램이 종료된다.
- 이 경우에는 멀티쓰레드의 실행시간이 더 짧다.
'Java' 카테고리의 다른 글
데몬 쓰레드와 쓰레드의 실행제어, 상태 (0) | 2022.12.09 |
---|---|
쓰레드의 우선순위와 그룹 (0) | 2022.11.30 |
쓰레드의 구현 방법과 실행 (0) | 2022.11.30 |
쓰레드의 정의 (0) | 2022.11.24 |
애너테이션 만들기 (0) | 2022.11.21 |