🌱 오늘의 주제 : 싱글쓰레드와 멀티쓰레드
🌱 싱글쓰레드와 멀티쓰레드
- 하나의 쓰레드로 두 작업을 처리하는 경우는 한 작업을 마친 후에 다른 작업을 시작한다.
- 두개의 쓰레드를 작업 하는 경우에는 짧은 시간동안 2개의 쓰레드가 번갈아 가면서 작업을 수행해서 동시에 두 작업이 처리되는 것과 같이 느낀다.
- 하나의 쓰레드로 두개의 작업을 수행한 시간과 두개의 쓰레드로 두 개의 작업을 수행한 시간은 거의 같다. 오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸린다. 이유는 쓰레드간의 작업 전환에 시간이 걸리기 때문이다.
- 싱글 코어에서 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다.
🌱 싱글쓰레드와 멀티쓰레드 예제
- 싱글 코어인 경우에는 멀티쓰레드라도 하나의 코어로 번걸아가면서 작업을 수행하는 것이므로, 두 작업이 절대 겹치지 않는다.
- 그러나, 멀티 코어에서는 멀티쓰레드로 두 작업을 수행하면, 동시에 두 쓰레드가 수행될 수 있으므로 겹치는 부분이 발생한다.
- 실행 결과는 매번 다른데, OS의 프로세스 스케줄러의 영향을 받기 때문이다.
public class ex13_3 {
static long startTime = 0;
public static void main(String[] args) {
// 싱글쓰레드와 멀티쓰레드
ThreadEx3_1 th1 = new ThreadEx3_1();
th1.start();
startTime = System.currentTimeMillis();
for(int i = 0; i < 300; i++)
System.out.printf("%s", new String("-"));
System.out.print("소요시간1:" + (System.currentTimeMillis() - ex13_3.startTime));
}
}
class ThreadEx3_1 extends Thread {
public void run() {
for(int i = 0; i < 300; i++)
System.out.printf("%s", new String("|"));
System.out.print("소요시간2: " + (System.currentTimeMillis() - ex13_3.startTime));
}
}
---
-----|||||||||||||---------|||||||--------------||||||||||||||||||---|||------------------|||||---||||||||||||---------------------|||---||||---|||--||||||||--------------------||||||---|||-------------------------||||||---||||------------||||||||||||||||||||||||||||||||||||||||||||--------|||||---|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--||||----------|||||||||||||||||||---------------------------------------------------------------------|||||||||---------------|||||||---------|---------------------------------||||||||||||||||||-||||||||||||||------|||||||||||||||||소요시간1:11소요시간2: 11
🌱 쓰레드의 I/O 블락킹(blocking)
- 쓰레드가 입출력(input and output) 처리를 위해 기다리를 것을 I/O블락킹이라고 한다.
- 두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우에는 싱글쓰레드 프로세스보다 멀티쓰레드 프로세스가 더 효율적이다. 예를 들어, 데이터를 입력받는 작업, 네트워크로 파일을 주고 받는 작업, 프린터로 파일을 출력하는 작업과 같이 외부기기와 입출력을 필요로 하는 경우가 이에 해당한다.
'Java' 카테고리의 다른 글
Java - 쓰레드의 상태 (0) | 2023.03.23 |
---|---|
Java - 쓰레드의 우선순위 & 데몬 쓰레드 (0) | 2023.03.21 |
Java - 쓰레드란? (0) | 2023.03.16 |
Java - 에너테이션의 조상, 규칙, 활용 (0) | 2023.03.16 |
Java - 메타 애너테이션이란? (0) | 2023.03.14 |