본문 바로가기
Language/Java

[Java] 쓰레드 2 - 싱글쓰레드와 멀티쓰레드

by 계범 2022. 3. 13.

싱글 쓰레드와 멀티 쓰레드

 

싱글코어에서 하나의 쓰레드로 두개의 작업을 수행한 시간과,

두개의 쓰레드로 두개의 작업을 수행한 시간은 거의 비슷하다.

 

두 개의 쓰레드로 수행한 게 좀 더 걸리게 되는데, 쓰레드간의 작업전환(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의 정석' 책

댓글