[Java] 쓰레드

김나우·2022년 1월 14일
0

Java

목록 보기
12/15

프로그램, 프로세스, 쓰레드

프로그램은 하드디스크에 저장된 파일들의 모임
프로세스는 메모리상에 로딩된 프로그램을 의미한다

메모리는 프로그램 전체를 한꺼번에 로딩하는 것이 아니라 그때그때
필요한 부분만을 동적으로 로딩한다, 이때 동일한 프로그램을 메모리에
2번 로딩하면 2개의 프로세스가 동작하는데, 이를 멀티 프로세스라 한다.

쓰레드의 개념

CPU는 속도 차이의 문제로 메모리의 프로세스와만 대화한다
이는 프로세스만 CPU를 사용할 수 있다는 것이다.
좀 더 들여다 보면 실제 CPU를 사용하는 것은 프로세스 내부의 쓰레드이다.

프로세스가 쓰레드를 갖고 있으므로 외부에서 보면 프로세스가 CPU를
사용하는 것처럼 보였던 것뿐이다. 따라서 쓰레드를 다른 말로 정의하면
'CPU를 사용하는 최소 단위'라고도 할 수 있다

자바 프로그램에서의 쓰레드

자바로 작성한 프로그램을 실행하면 메모리로 로딩돼 프로세스 상태가 된다.

먼저 .class 파일을 실행하면 자바 가상 머신은 main 쓰레드를 생성한다.
즉, 프로그램이 처음 실행되면 시작 시점에서는 main 쓰레드 1개만이 존재하는 것 이다.
main()메서드에서 작성한 내용이 바로 이 main 쓰레드에서 동작한다
만일 main 쓰레드의 내부에서 2개의 쓰레드를 생성해 실행하면 동시에
2개 이상의 쓰레드가 동작하게 되는데, 이를 멀티 쓰레드프로세스라 한다.

멀티 쓰레드의 필요성

쓰레드는 CPU를 사용하는 최소 단위다. 그렇다면 멀티 쓰레드는 2개 이상의
쓰레드가 동시에 사용한다는 의미다.
내가 이런식으로 출력하고 싶다고 가정해 보자

1 하나
2345 다섯

반복해서 출력해야 하므로 for문을 사용해 작성하면

1
2
3
4
5
하나
둘
셋
넷
다섯

이런식으로 나올것이다. 이건 내가 원했던 결과가 아니다 이 문제를 해결하기 위해 필요한게 멀티 쓰레드다.

쓰레드는 정말 동시에 수행될까?

쓰레드는 CPU를 사용하는 최소 단위라 했으므로 만일 2개의 쓰레드가 있다면
2개의 작업이 동시에 수행될 것이다.
내 컴퓨터에는 단 하나의 CPU만 있는데 어떻게 각 쓰레드는 동시에 실행되는걸까?
이를 이해하기 위해서는 쓰레드의 동시성병렬성을 이해해야 한다.

멀티 쓰레드를 사용하지 않을 때, 단일 쓰레드로 2개의 작업을 처리할 때 각 작업은
순처적으로 처리된다. 즉 먼저 시작된 작업이 완전히 종료된 이후에
두 번째 작업이 실행되는 것이다.

동시성

동시성은 처리할 작업의 수가 CPU의 코어 수보다 많을 때다.
동시에 처리해야 할 작업이 CPU의 코어보다 많을 때 CPU는 각 작업 쓰레드의
요청 작업을 번갈아가면서 실행한다. 매우 짧은 간격으로 교차 실행하기 때문에
사용자는 두 작업이 마치 동시에 실행되는 것처럼 보이는 것이다
이를 쓰레드의 동시성이라고 한다.

두 작업이 동시에 실행되는 것이 아니라 동시에 실행되는 것처럼 보이도록 하는 방식이다

병렬성

CPU의 코어 수가 작업 수보다 많을 때는 각각의 작업을 각각의 코어에
할당해 동시에 실행할 수 있기 때문에 그야말로 동시에 작업이 수행된다.
이를 쓰레드의 병렬성이라 한다.

쓰레드의 목적은 병렬성동시성을 활용해 여러 작업을 동시에
실행하거나 동시에 실행하는 것처럼 보이게 하는 것이다.

쓰레드의 생성 및 실행

쓰레드를 생성하는 방법은 크게 2가지로 나눌 수 있다
첫 번째 방법은 Thread 클래스를 상속받아 run() 메서드를 오버라이딩 하는 것으로
이 메서드의 내부에서 작성된 내용이 바로 CPU를 독립적으로 사용하면서 동시에
실행되는 것이다.

두 번째 방법은 두 단계로 이뤄져 있는데, 첫 번째 단계에서는
Runable 인터페이스를 구현한 Runable 객체를 생성한다
이 인터페이스는 추상 메서드로 run() 메서드를 갖고 있다. 따라서 당연히
인터페이스 객체 생성 과정에서 run() 메서드를 구현해햐 할 것이다

두 번째 단계에서는 Thread 객체를 생성할 때 앞 단계에서 생성한 Ruable객체를
생성자로 전달하는 것이다. 즉, 2가지 생성 방법 모두 run() 메서드를 재정의 하고 있고, 결과적으로 Thread 객체를 생성한다.

생성한 쓰레드를 실행하는 방법은 Thread 객체 내의 start() 메서드를 호출
하는 것이다. 여기서 재정의한 메서드는 run() 이지만, run()의 내용을
실행하기 위해서는 반드시 start() 메서드를 호출해야 한다!!

한 번 실행된 Thread 객체는 재사용할 수 없다. 다시 사용하고 싶으면
객체를 다시 생성해야 한다.

==추가 예정==

profile
안녕하세요

0개의 댓글