남궁성님의 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으로 인한 오베헤드가 발생하기 때문에 멀티코어 환경에서 멀티쓰레드를 사용한다고 항상 빠르다고 할 수는 없다 !!
'Programming > Java' 카테고리의 다른 글
[Java] 쓰레드(Thread) - 5(쓰레드 상태와 실행제어) (0) | 2023.12.10 |
---|---|
[Java] 쓰레드(Thread) - 4(데몬 쓰레드) (0) | 2023.12.10 |
[Java] 쓰레드(Thread) - 2(쓰레드와 Stack Area) (0) | 2023.12.10 |
[Java] 네트워크 프로그래밍 - 2(Socket, TCP/UDP) (0) | 2023.12.10 |
[Java] 해싱과 equals() hashCode (0) | 2023.11.03 |