싱글쓰레드와 멀티쓰레드

2022. 2. 14. 16:20·자바/프로세스와 쓰레드

1. 싱글 쓰레드와 멀티 쓰레드의 개념

- 두 개의 작업을 하나의 쓰레드(th1)로 작업하는 것을 싱글쓰레드, 두 개의 쓰레드(th1, th2)로 작업하는

것을 멀티쓰레드라고 부른다.

( 위의 그림은 싱글쓰레드와 멀티쓰레드를 보여준다. )

 

( t2와 t`2의 끝나는 시간은 같지만 t1은 t`1보다 더 빨리 끝난다. 왜냐하면 그림에서 보여주듯이 멀티에서는

쓰레드의 '작업전환(context switching)'을 하기 때문이다. )

 

( 작업전환으로 인해 보통 PC(Program Counter) 등의 정보를 얻어야 하기 때문에 시간이 걸린다. )

 

( 그래서 무조건 멀티쓰레드가 좋은 것이 아니기 때문에, 단순히 CPU만을 사용하는 계산 작업이면

싱글쓰레드가 유리하다. )

 

 

 

 

1-1. 싱글쓰레드와 멀티쓰레드를 이해하기 위한 예제(1)

: 하나의 작업에 대해 두 개의 쓰레드를 수행하면서 싱글코어(1)와 멀티코어(4)를 비교하는 예제이다.

 

import java.util.*;

public class Exercise003 {
	static long nowTime = 0;
	
	public static void main(String[] args) {
		ThreadEx3 t1 = new ThreadEx3();
		t1.start();
		nowTime = System.currentTimeMillis();
		
		for(int i=0; i<300; i++) {
			System.out.printf("%s", new String("-"));
		}
		System.out.print("소요시간1:" + (System.currentTimeMillis()-Exercise003.nowTime));
	}
}

class ThreadEx3 extends Thread{
	public void run() {
		for(int i=0; i<300; i++) {
			System.out.printf("%s", new String("|"));
		}
		System.out.print("소요시간2:" + (System.currentTimeMillis()-Exercise003.nowTime));
	}
}

 

( 아래의 출력문은 싱글과 멀티 코어를 가지고 똑같이 위의 코드를 실행한 결과이다. )

( 싱글코어(1) 출력문: -----||||||---- ..... ---- 소요시간1: 65 ||||||||||||||||||| 소요시간2: 65 )

( 멀티코어(4) 출력문: ----||-||--||-- ..... |-소요시간2: 56 -------------- 소요시간1: 62 )

 

( 두 개의 작업을 하는데도 많이 걸린 이유는 작업전환시간과 대기시간 때문이다. )

( 위의 출력문에는 각 os마다 스케줄러에 의해 다를 수 있다. )

 

 

( 확실한 건 두 개의 쓰레드를 작업할 때 멀티 코어가 유리하다. 그 이유는 아래와 같다. )

( 싱글 코어(1)인 경우, 멀티 쓰레드에서 하나의 코어가 번갈아 가면서 작업을 하기 때문에 두 작업이 겹치지 않는다. )

( 그러나, 멀티 코어(4)에서는 멀티 쓰레드로 두 작업을 수행하면 동시에 두 쓰레드가 수행되므로, 작업이 겹친다. )

 

( 그러므로, 멀티 코어(4)가 더 빠를 수 밖에 없었다. )

 

 

( 위에서 얻을 수 있는 점은 두 쓰레드가 다른 자원을 사용하는 적업일 경우에는 싱글쓰레드 프로세스보다

멀티쓰레드 프로세스가 더 효율적이다. )

( 예를 들면, 사용자에게 입력받는 작업 + 네트워크로 파일을 주고받는 작업 + 프린터로 파일을 출력하는 작업

 + ... 등 을 말한다. 아래의 그림을 보자. )

 

( 첫 번째 그래프와 두 번째 그래프의 차이점은 쓰레드의 개수이다. )

 

( 첫 번째 그래프에서의 빨간 네모박스는 하나의 쓰레드가 A를 수행 후 사용자의 입력을 받기

위해서 A의 작업을 대기하면서 아무작업을 하지 못하는 현상이 일어났다. )

( 그렇게 되면, cpu의 사용률이 떨어지게 된다. )

 

( 두 번째 그래프는 두 개의 쓰레드가 있기 때문에, A를 수행 후 입력 대기하는 상황에서 다른 자원을

이용하는 B를 수행할 수 있게 되어 첫 번째 그래프보다 더 빨리 끝나게 된다. )

 

 

 

 

1-2. 싱글쓰레드와 멀티쓰레드를 이해하기 위한 예제(2)

: 하나의 쓰레드로 두 개의 작업을 하는 것과 두 개의 쓰레드로 두 개의 작업을 수행하는 것을

보여주는 예제이다. 

 

( 아래는 싱글 쓰레드로 두 개의 작업을 하는 것을 보여준다. )

import java.util.*;

import javax.swing.JOptionPane;

public class Exercise004 {
	public static void main(String[] args) {
		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
		System.out.println("입력하신 값은 " + input + "입니다.");
		
		for(int i=5; i>0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(500);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

( 아래는 멀티 쓰레드로 두 개의 작업을 하는 것을 보여준다. )


import javax.swing.JOptionPane;

public class Exercise005 {
	public static void main(String[] args) {
		ThreadEx4 t1 = new ThreadEx4();
		t1.start();
		
		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
		System.out.println("입력하신 값은 " + input + "입니다.");
	}
}

class ThreadEx4 extends Thread{
	public void run() {
		for(int i=5; i>0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(500);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

 

 

( 위 두 개의 코드를 수행해보면 아래의 그림처럼 수행하는 것을 알 수 있다. )

 

 

 

 

2. 병행과 병렬

- 병행은 여러 쓰레드가 여러 작업을 동시에 진행하는 것을 말한다.

- 병렬은 하나의 작업을 여러 쓰레드가 나눠서 처리하는 것을 말한다.

'자바 > 프로세스와 쓰레드' 카테고리의 다른 글

쓰레드의 실행제어  (0) 2022.02.20
데몬 쓰레드  (0) 2022.02.14
쓰레드의 우선순위와 쓰레드 그룹  (0) 2022.02.14
쓰레드의 기본적 구현과 실행  (0) 2022.02.14
프로세스와 쓰레드의 전반적인 개념  (0) 2022.02.14
'자바/프로세스와 쓰레드' 카테고리의 다른 글
  • 데몬 쓰레드
  • 쓰레드의 우선순위와 쓰레드 그룹
  • 쓰레드의 기본적 구현과 실행
  • 프로세스와 쓰레드의 전반적인 개념
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      중간연산
      java.time 패키지
      역직렬화
      코딩테스트
      map()
      Collections Framework
      선택 정렬
      유용한 클래스
      다형성
      소켓 프로그래밍
      java.lang패키지
      안정 정렬
      TCP 소켓 프로그래밍
      file
      자바 개념
      문자 기반 스트림
      outputstream
      ServerSocket
      Arrays
      제자리 정렬
      코딩트리조별과제
      스트림
      snail
      람다식
      InputStream
      안드로이드 스튜디오
      알고스팟
      코드트리
      불안정 정렬
      serializable
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    싱글쓰레드와 멀티쓰레드
    상단으로

    티스토리툴바