[Java][Thread] 싱글쓰레드와 멀티쓰레드

2022. 6. 30. 11:34JAVA/Language

1. 싱글쓰레드 프로세스와 멀티쓰레드 프로세스의 차이

  • 싱글쓰레드는 순차적으로 작업들을 처리함
  • 멀티 쓰레드는 여러 작업들을 번갈아 가면서 수행하면서 여러 작업이 동시에 실행되는 것과 같은 효과를 줌

 

멀티 쓰레드가 싱글 쓰레드보다 느린 경우는 무엇인가?

  • 같은 자원을 가지고 사용하는 작업의 경우에는 싱글쓰레드보다 느릴 수 있음
  • 쓰레드간의 작업 전환(Context Switching)에 시간이 걸림

싱글 쓰레드보다 멀티 쓰레드가 효율적인 경우는 무엇인가?

  • 두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우에는 싱글 쓰레드 프로세스보다 멀티 쓰레드 프로세스가 더 효율적임
  • 예를 들어 사용자로부터 데이터를 입력받는 작업, 네트워크로 파일을 주고받는 작업, 프린터로 파일을 출력하는 작업과 같이 외부기기와의 입출력을 필요로 하는 경우가 이에 해당됨

 

다음 예제는 싱글 쓰레드로 클라이언트로부터 문자열을 입력받는 예제입니다. 그러나 원래 의도는 입력 제한 시간을 10초로 설정하기 위해서 1초가 경과할수록 콘솔창에 숫자를 출력하도록 의도하였습니다.

public class Driver {
	
	public static void main(String args[])
	{
		String input = JOptionPane.showInputDialog("아무값이나 입력하시오.");
		System.out.println("입력하신 값은 " + input + "입니다.");
		
		for(int i=10; i>0; i--)
		{
			System.out.println(i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
입력하신 값은 abcd입니다.
10
9
8
7
6
5
4
3
2
1

싱글 쓰레드로 수행했을때의 결과는 의도와는 다르게 입력과 타이머가 동시에 되지 않고 입력을 받은 다음 타이머가 작동한 것을 볼 수 있습니다.

 

다음 예제는 이전 예제를 멀티 쓰레드로 수행한 예제입니다.

public class MyThread extends Thread{

	@Override
	public void run() {
		for(int i=10; i>0; i--)
		{
			System.out.println(i);
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

public class Driver {
	
	public static void main(String args[])
	{
		MyThread t1 = new MyThread();
		t1.start();
		
		String input = JOptionPane.showInputDialog("아무값이나 입력하시오.");
		System.out.println("입력하신 값은 " + input + "입니다.");
		
		
	}
}
10
9
8
7
6
입력하신 값은 abcd입니다.
5
4
3
2
1

멀티 쓰레드로 실행했을 때는 위 실행결과처럼 타이머와 문자열 입력이 독립적으로 수행됨을 알 수 있습니다.

 

정리하며

같은 자원을 가지고 작업을 수행할 때는 싱글쓰레드와 멀티 쓰레드의 수행속도는 차이가 미미합니다. 그러나 서로 다른 자원을 가지고 작업을 수행할때는 효율적으로 수행됨을 알 수 있습니다.

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
[도서] Java의 정석, 남궁 성 지음