[기본 개념]
프로세스(process) : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 것
스레드(thread) : 프로세스 내부에서 코드의 실행 흐름을 의미함.
스레드
- 멀티 프로세스(multi process) : 자신의 메모리를 가지고 실행하므로 서로 독립적이지만, 멀티 스레드는 하나의 프로세스 내부에 생성되므로 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받는다. 따라서 멀티 스레드는 예외처리를 잘 해줘야 한다.
- 멀티 스레드(multi thread) : 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우
- 스레드(thread) : 사전적 의미로 한 가닥의 실이라는 뜻. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어놓았다고 해서 유래된 이름
- 멀티 스레드의 사용
- 대용량 데이터 처리 시간을 줄이기 위해 데이터를 분할해서 병렬로 처리
- UI를 가지고 잇는 애플리케이션에서 네트워크 통신을 하기 위해 사용
- 다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용
메인 스레드
- 자바의 모든 애플리케이션은 메인 스래드가 main() 메소드를 실행하면서 시작된다.
- 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
- 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
작업 스레드 생성과 실행
- 멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성한다.
- 모든 애플리케이션은 메인 스레드가 반드시 존재하기 때문에, 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생서하면 된다.
- 자바에서는 작업 스래드도 객체로 생성되기 때문에 클래스가 필요하다.
< 클래스 생성하는 방법 >
① Thread 클래스로부터 직접 생성
- java.lang.Tread 클래스로부터 작업 스래드 객체를 직접 생성하려면 다음과 같이 Runnable을 매개값으로 갖는 생성자를 호출한다.
- Thread thread = new Thread(Runnable target);
- 다음과 같이 Runnable 구현 클래스를 작성한다.
Thread thread = new Thread(new Runnable) {
public void run(){
스래드가 실행할 코드; //익명 구현 객체
}
}
- 위와 같이 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있다.
- 작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start() 메소드를 호출해야만 실행이 된다.
- thread.start();
② Thread 하위 클래스로부터 생성
- 작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시키는 방법
- Thread 클래스를 상속한 후 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성한다.
public class WorkerThread extends Thread {
@Override
public void run(){
스래드가 실행할 코드; //run 메소드 재정의
}
}
Thread thread = new WorkerThread();
- 코드를 더 절약하기 위해 다음과 같이 Thread 익명 객체로 작업 스레드 객체를 생성할 수도 있다.
Thread thread = new Thread(){
public void run(){
스레드가 실행할 코드; //익명 자식 객체
}
};
③ 스레드의 이름
- 스레드는 자신의 이름을 가지고 있다.
- 스레드의 이름이 큰 역할을 하는 것은 아니지만, 디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용된다.
- 스레드 이름 설정 : thread.setName("스레드 이름");
- 스레드 이름 조회 : thraea.getName();
동기화 메소드
① 공유 객체를 사용할 때의 주의할 점
- 멀티 스레드 프로그램에서 스레드들이 객체를 공유해서 작업해야 하는 경우
- 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있기 때문에 주의해야 한다.
② 동기화 메소드
- 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 하려면 스레드 작업이 끝날 때 까지 객체에 잠금을 걸어 다른 스레드가 사용할 수 없도록 해야 한다.
- 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 한다.
- 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드를 제공한다.
- 동기화 선언을 하는 방법 : 메소드 선언에 synchronized 키워드를 붙인다.
'Coding > Java' 카테고리의 다른 글
[30] JAVA 컬렉션 프레임워크 (0) | 2022.12.25 |
---|---|
[29] JAVA 스레드 제어 (0) | 2022.12.21 |
[27] JAVA 기초 복습 (0) | 2022.12.14 |
[26] JAVA 익명 객체 (Anonymous) (0) | 2022.12.10 |
[25] JAVA 중첩 클래스/ 중첩 인터페이스 (0) | 2022.12.09 |