우선, 사람의 머리로 멀티 태스킹을 자주 치매가 온다는 연구 결과가
있다는것 같으니 우리는 한번에 하나의 일에만 집중해야 한다.
thread
인간의 두뇌는 멀티 태스킹을 할 수 없다.
멀티 태스킹처럼 아주 빠른 전환의 반복만이 존재할 뿐이다.
판타지 소설을 보면 수준 높은 마법사들은 동시에 여러 마법들을 사용하는
`멀티 캐스팅` 을 선보인다.
소설이라 가능한 일이니 현실 마법사들분들은 판타지 그만 보시고
한번에 하나의 마법만 쓰도록 하자.
우선 강의에서 나온 코드를 그대로 보자
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 100; i++) {
System.out.print("$");
}
};
Runnable task2 = () -> {
for (int i = 0; i < 100; i++) {
System.out.print("*");
}
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task2);
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
두개의 thread
에서 각각 *
과 $
를 출력하는 multiThread
이다.
한가지 의문이 들었다.
진정한 multiThread
라고 한다면 *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$* 형태의
출력 결과를 보여야 하지 않나?
최소한 *$$*$*$*$*$**$$***$*$*$$ 정도가 되어야 하지 않나?
공식 문서에서는 관련된 내용을 찾을 수 없었다.
오히려 해당 내용과 관련된 부분을 명확하게 설명하는것이 아님을 고지하고 시작하더라.
그래서 여기 저기 구글링을 해보다 보니 multiProcessing
을 또 알게 되었다.
파면 팔수록 뭐가 나온다... 벌집을 건들였다는 기분이 또 다시 들었다 stream()
좀 더 찾아보니 multiProcessing
은 아예 여러개의 main
을 동시에 작성해 각기 다른 cpu 코어에서 실행하는 말 그대로의 MultiProcess 였다.
쓰레드 여러개를 동시 돌리는 개념보다 상위로 봐야 할것 같더라.
같은 방식으로 *
과 $
을 출력하는 코드를 작성해도 *****$$$$$*****$$$$$... 식으로 나올거라 생각했다.
원인은 그 부분에 있는게 아니었으니까
돌아와서, multiThread
는 그럼 왜 완벽하게 교차되는 출력값을 내지 못하나?
아쉽게도 나 같은 궁금증을 가진 사람들을 찾기에는 내 구글링 실력에 이슈가 좀 있었다.
해서 GPT몽
에게 물어보자
결국 내용을 보아하니 두개의 쓰레드를 스위칭 하는 과정context switching
에서
발생하는 비용이 크기 때문에
(이건 인간도 마찬가지다. 그래서 멀티 태스킹이 치매를 앞 당긴다고 한다.)
한가지 쓰레드를 조금 오래 잡고 있으려고 한단다.
결국 쓰레드 양쪽에 적당한 틱을 줘서
출력 시간을 좀 늘리되 안정적으로 완벽한 패턴을 출력하던가
컴퓨터가 존나게좋던가 둘 중 하나라고 한다.
강의를 따라가다 보니 우선도를 주는 내용이 나오긴 했지만 내가 궁금했던 부분을
보완해주진 않았기에 해당 내용은 다루지 않기로 한다.
'TIL' 카테고리의 다른 글
2023년 11월 5일 @Getter @Setter @NoArgsConstructor (1) | 2023.11.07 |
---|---|
2023년 11월 4일 정수 삼각형 (1) | 2023.11.07 |
2023년 11월 2일 try catch finally (0) | 2023.11.03 |
2023년 11월 1일 (0) | 2023.10.31 |
2023년 10월 31일 상속과 포함 (0) | 2023.10.31 |