Programming/Java

[Java] 쓰레드(Thread) - 3(싱글쓰레드 vs. 멀티쓰레드)

kmindev 2023. 12. 10. 20:05

 

남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.

 

싱글쓰레드와 멀티쓰레드

a. 싱글쓰레드

public class SingleThredTest {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 300; i++) {
            System.out.printf("%s", new String("_"));
        }

        System.out.println("소요시간1: " + (System.currentTimeMillis() - startTime));
				System.out.println();

        for (int i = 0; i < 300; i++) {
            System.out.printf("%s", new String("|"));
        }

        System.out.println("소요시간2: " + (System.currentTimeMillis() - startTime));
    }
}

실행결과
________... ____소요시간1: 16
||||||...|||||소요시간2: 16**
  • 하나의 작업이 끝나고 다음작업을 진행하게 된다.

 

b. 멀티쓰레드

참고로 10코어 환경에서 실행한 예제이다. 싱글 코어의 경우에는 소요시간이 더 오래걸린다.

public class MultiThreadTest {
    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.printf("%s", new String("-"));
        }
        System.out.println("소요시간1: " + (System.currentTimeMillis() - startTime));
    }
}

class ThreadEx5_1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.printf("%s", new String("|"));
        }
        System.out.println("소요시간2:" + (System.currentTimeMillis() - MultiThreadTest.startTime));
    }
}

실행결과
-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||--||||||||||||||||||||||||||||||||||||||----|||||||||||
||||||||||--------||||||--------------------------------------|||||||||||||||||||||||||
||||--||||||||||||||||||||||||||||||||||||||||||||---|||||||||||||||||||||||||||||||||-
----------|||||||||||||----------|||-------------|||||---------------------------------
---------------------------------------------------------------------------------------
------------------------------------------------------------------------------소요시간1: 16
소요시간2:16
  • 두 개의 작업이 동시에 끝나는 것을 확인할 수 있다.
  • 실행할 때마다 다른 결과가 나오는 이유는 OS의 스케줄러의 영향을 받기 때문이다.

 

c. 싱글코어 멀티쓰레드

  • 싱글코어 환경에서 멀티쓰레드의 소요시간은 싱글쓰레드의 소요시간과 크게 차이나지 않거나 더 많이 걸리는 경우가 발생한다.
    • 싱글 코어는 A, B 작업을 동시에 수행할 수 없으며, 쓰레드간의 작업전환시간(Context Switching)이 발생하면서 현재 진행 중인 작업의 상태 같은 정보를 저장하고 읽어오는 시간이 추가적으로 소요 되기 때문이다.
  • 싱글코어에서는 단순히 CPU 만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드를 사용하는 것이 효율적이다.

 

 

d. 멀티코어 멀티쓰레드

  • 멀티코어에서는 두 쓰레드가 수행될 수 있으므로, A와 B가 겹치는 부분이 발생하고 작업시간 또한 소요시간도 짧다.
  • 겹치는 부분이 발생하는 이유는 하나의 공유 리소스(console)에 대해 th1과 th2가 경쟁하기 때문이다.
  • 멀티쓰레드를 사용하면 Context Switching으로 인한 오베헤드가 발생하기 때문에 멀티코어 환경에서 멀티쓰레드를 사용한다고 항상 빠르다고 할 수는 없다 !!