안녕하세요. pitang입니다.
멀티 스레드에 대해 알아보겠습니다.. 오늘 이해력이 0이어서 잘 설명할 수 있을지 모르겠어요. 그래도 정리해보겠습니다!!
멀티 스레드 개념
스레드(thread)는 사전적 의미로 한 가닥의 실이라는 뜻이다.
한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어 놓았다고 해서 유래된 이름이다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있다.
멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다.
멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에
하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에게 영향을 미치게 된다.
그렇기 때문에, 멀티 스레드에서는 예외 처리를 거의 꼭 해줘야 한다.
모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행하면서 시작된다.
메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해 멀티 태스킹을 수행한다.
작업 스레드 생성과 실행
어디서든 메인 스레드는 반드시 존재하기 때문에 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하면 된다.
자바에서는 작업 스레드도 객체로 생성되기 때문에 클래스가 필요하다.
java.langThread 클래스를 직접 객체화해서 생성해도 되지만, Thread를 상속해서 하위 클래스를 만들어 생성할 수도 있다.
Thread 하위 클래스로부터 생성
작업 스레드가 실행할 작업을 Runnable로 만들지 않고,
Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수 있다.
작업 스레드 객체에서 start() 메서드를 호출하면 작업 스레드는 자신의 run() 메서드를 실행하게 된다.
Thread클래스를 상속한 후 run메서드를 재정의해서 스레드가 실행할 코드를 작성한다.
작업 스레드 클래스로부터 작업 스레드 객체를 생성하는 방법은 일반적인 객체를 생성하는 방법과 동일하다.
ex1)
-> 위에 엄청 많은 실행결과가 있다. 안에서 다른 스레드 종료도 나타나고 마지막은 프로그램 종료가 출력된다.
ex2)
ex3)
- 메인 스레드만 이용한 경우
toolkit의 객체를 얻어서 beep() 메서드 beep음을 발생시키는 메서드를 활용한다.
-> 1초의 주기로 프린팅을 출력한 후, beep음을 발생시키는 실행결과가 나오게 된다.
beep음 발생과 프린팅은 서로 다른 작업이므로 메인 스레드가 동시에 두 가지 작업을 처리할 수 없다.
ex4)
-> 1초의 주기로 beep음을 발생시키면서 동시에 프린팅을 하는 실행결과가 나온다.
beep음과 프린팅 작업 두개 중 하나 또는 모두를 메인 스레드가 아닌 다른 스레드에서 실행시킨다면 동시에 실행할 수 있다.
Thread 클래스로부터 직접 생성
java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 Runnable을 매개 값으로 갖는 생성자를 호출해야 한다.
Runnable은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 개체라고 해서 붙여진 이름이고,
인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 한다.
run()이라는 메서드를 오버라이딩해서 작업 스레드가 실행할 코드로 작성해야 한다.
작업 스레드 객체에서 start() 메서드를 호출하면 작업 스레드는 자신의 run() 메서드를 실행하게 된다.
ex1)
- Runnable은 작업 내용을 가지고 있는 객체이지 실제 스레드는 아니다.
Runnable 구현 객체를 생성한 후, 이것을 매개 값으로 해서 Thread 생성자를 호출하면 작업 스레드가 생성된다.
Runnable 인터페이스는 run() 메서드 하나만 정의되어 있기 때문에 함수적 인터페이스이다.
-> 1초의 주기로 beep음을 발생시키면서 동시에 프린팅을 하는 실행결과가 나온다.
ex2)
- Runnable 익명 객체 이용
코드를 좀 더 절약하기 위해 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개 값으로 사용할 수 있다.
이 방법이 더 많이 사용된다.
-> 1초의 주기로 beep음을 발생시키면서 동시에 프린팅을 하는 실행결과가 나온다.
꽤 어려운 내용이었는데요.
동기화 메서드와 동기화 블록은 살펴보지 않았습니다.
12장 중에서도 12.1, 12.2 그리고 12.3 만 살펴보았어요...
나중에 개념을 더 채워야겠지만 이정도 만으로도 엄청 벅차네요ㅠㅠ
감사합니다.
*m1 맥북을 사용 중입니다.*
'6개월 대장정 > JAVA 개념' 카테고리의 다른 글
24일차 - 컬렉션 프레임 워크-List컬렉션 (0) | 2021.09.15 |
---|---|
24일차 - 제네릭 (0) | 2021.09.15 |
23일차 - 기본 API 클래스(4, Wrapper 클래스) (0) | 2021.09.14 |
22일차 - 기본 API 클래스(3, Object클래스) (0) | 2021.09.13 |
21일차 - 기본 API 클래스(2, 정규표현식) (0) | 2021.09.12 |