싱글 쓰레드와 멀티 쓰레드
싱글코어에서 하나의 쓰레드로 두개의 작업을 수행한 시간과,
두개의 쓰레드로 두개의 작업을 수행한 시간은 거의 비슷하다.
두 개의 쓰레드로 수행한 게 좀 더 걸리게 되는데, 쓰레드간의 작업전환(context switching)에 시간이 걸리기 때문이다.
작업전환에는 다음에 실행시켜야할 위치(PC, 프로그램 카운터) 등의 정보를 저장하고 읽어오는 시간이 소요된다.
쓰레드의 스위칭보다 프로세스의 스위칭이 더 많은 정보가 교환되므로 더 많은 시간이 소요.
class ThreadEx5 {
static long startTime = 0;
public static void main(String args[]) {
ThreadEx5_1 th1 = new ThreadEx5_1();
th1.start();
startTime = System.currentTimeMillis();
for(int i=0; i < 300; i++) {
System.out.print("-");
}
System.out.print("소요시간1:" + (System.currentTimeMillis() - ThreadEx5.startTime));
}
}
class ThreadEx5_1 extends Thread {
public void run() {
for(int i=0; i < 300; i++) {
System.out.print("|");
}
System.out.print("소요시간2:" + (System.currentTimeMillis() - ThreadEx5.startTime));
}
}
싱글코어에서는 멀티 쓰레드라도 하나의 코어가 번갈아가면서 작업을 수행하므로 두 작업이 절대 겹치지 않는다.
하지만 멀티코어에서는 두 쓰레드가 수행 될 수 있으므로, A와 B가 겹치는 부분이 발생한다.
(------ 출력후 |||||| 출력되는 것과, -|--|||--| 섞여서 출력되는걸 말함)
위의 결과는 실행할때마다 결과가 다를 수 있는데, 그 이유는 OS의 프로세스 스케줄러의 영향을 받기 때문이다.
두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우에는 멀티쓰레드 프로세스가 더 효율적이다.
한 쓰레드가 사용자로부터 데이터를 입력받는 등의 대기를 하게 될 경우에, 싱글스레드면 대기시간동안 아무것도 하지 않기 때문이다.
멀티스레드 환경 예시
1) 메인 스레드는 입력값 받기
2) 다른 스레드는 1초간격으로 10~1까지 출력
import javax.swing.JOptionPane;
class ThreadEx7 {
public static void main(String[] args) throws Exception {
ThreadEx7_1 th1 = new ThreadEx7_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
class ThreadEx7_1 extends Thread {
public void run() {
for(int i=10; i > 0; i--) {
System.out.println(i);
try {
sleep(1000);
} catch(Exception e ) {}
}
}
}
10
9
8
7
6
입력하신 값은 ABC입니다. // 중간에 입력
5
4
3
2
1
참조
'Java의 정석' 책
'Language > Java' 카테고리의 다른 글
[Java] 쓰레드 4 - 데몬 쓰레드(daemon thread) (2) | 2022.03.14 |
---|---|
[Java] 쓰레드 3 - 쓰레드 우선순위와 쓰레드 그룹 (0) | 2022.03.14 |
[Java] 쓰레드 1 - 구현 및 실행(start, run) (0) | 2022.03.13 |
[Java] 제네릭(Generic) (0) | 2022.03.11 |
[Java] 정규식(Reualar Expression), 정규표현식(Regex) (0) | 2022.03.09 |
댓글