-
[Java 자바] 12. 멀티 스레드 ① 개념과 생성방법, 우선순위Programming/Java 2022. 9. 12. 14:02반응형
12-1. 멀티 스레드란?
12-1-1. 프로세스와 스레드
- 프로세스: 운영체제에서 실행 중인 하나의 애플리케이션
- 멀티태스킹: 두 가지 이상의 작업을 동시에 처리하는 것
=> 멀티태스킹이 꼭 멀티프로세스를 뜻하지는 않으며, 한 프로세스 내에서 두 가지 이상의 작업을 처리할 수 있음
=> 멀티 스레드를 이용하여 한 프로세스 내에서 여러가지 작업을 가능하게 하는 것!
- 멀티 프로세스들은 운영체제에서 할당 받은 자신의 메모리를 가지고 실행되기 때문에 상호 독립적
- 멀티 스레드로 동작하는 파일은 다른 스레드에서 오류가 발생하면 함께 영향을 받음 => 예외, 오류 처리에 주의해야 함12-1-2. 메인 스레드
- 모든 자바 어플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작
- 기본적으로 위에서 아래 순서대로 코드를 실행하며, 필요에 따라 작업 스레드를 만들어 병렬로 코드를 실행
=> 멀티 스레드를 만들어 멀티 태스킹을 수행- 싱글스레드는 메인스레드가 종료되면 프로세스가 종료됨
- 멀티스레드는 메인스레드가 작업 스레드보다 먼저 종료되더라도 다른 작업 스레드가 종료될 때까지 프로세스가 종료되지 않음
12-2. 작업 스레드 생성과 실행
- 멀티 스레드로 실행하기 위해선 몇 개의 작업을 병렬로 실행할지 결정 후, 각 작업별 스레드를 생성해야 함
- 작업스레드 생성 방법 ① java.lang.Thread 클래스를 직접 객체화 ② Thread 상속하여 하위 클래스 생성
12-2-1. Thread 클래스로부터 직접 생성
- Runnable을 매개값으로 갖는 생성자 호출
- Runnable은 인터페이스 타입으로 구현 객체를 만들어 대입해야 하며, run() 메소드를 재정의하여 작업스레드가 실행할 코드 작성
// 1. 작업스레드 객체를 생성(Runnable을 매개값으로 갖는 생성자 호출) Thread thread = new Thread(Runnable target); // 2-1. Runnable 구현 클래스 작성 class Task implements Runnable { public void run() { 스레드가 실행할 코드; } } // Runnable은 작업 내용을 가지고 있는 객체로, // Thread 생성자를 호출해야 작업 스레드가 생성됨 Runnable task = new Task(); Thread thread = new Thread(task); // 2-2. Thread생성자 호출 시 Runnable 익명 객체를 매개값으로 사용하는 방법 // 좀 더 효율적으로 사용할 수 있음 Thread thread = new Thread(new Runnable() { public void run() { 스레드가 실행할 코드; } }); // 3. 작업스레드는 즉시 실행되지 않고, 다음과 같이 start()메소드를 실행해야 함 thread.start();
12-2-2. Thread 하위 클래스로부터 생성
- Thread 클래스 상속 후 run 메소드를 재정의(overriding)하여 실행할 코드를 작성
// 1-1. 작업스레드 클래스로부터 작업스레드 객체 생성 public class WorkerThread extends Thread { @Override public void run() { 스레드가 실행할 코드; } } Thread thread = new WorkerThread(); // 1-2. 익명객체로 작업스레드 객체 생성 Thread thread = new Thread() { public void run() { 스레드가 실행할 코드; } }; // 2. thread 실행 thread.start();
12-2-3. 스레드의 이름
- 메인 스레드: main
- 직접 생성한 스레드: 자동적으로 "Thread-n"이라는 이름으로 설정됨 (n은 스레드 번호)
// 스레드 이름 변경 thread.setName("스레드이름"); // 스레드 이름 조회 thread.getName(); // 현재 실행 중인 스레드의 참조 얻기 Thread thread = Thread.currentThread();
12-3. 스레드 우선순위
- 동시성: 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
- 병렬성: 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
- 스레드 스케줄링: 스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정하는 것
① 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링
- 스래드 객체에 우선순위 번호 부여가 가능하므로 코드로 제어할 수 있음
- 1~10까지 우선순위 부여가 가능하며, 1이 우선순위가 가장 낮음
- 우선순위를 부여하지 않으면 기본적으로 5의 우선순위를 할당 받음- 우선순위 변경은 setPriority() 메소드를 이용
- 최소 5개 이상의 스레드가 실행되어야 우선순위에 영향을 받음(4개까지는 병렬성으로 실행될 수 있음)
thread.setPriority(우선순위); // 값을 직접 줘도 되고, 코드의 가독성을 높이기 위해 상수를 사용할 수도 있음 thread.setPriority(Thread.MAX_PRIORITY); thread.setPriority(Thread.NORM_PRIORITY); thread.setPriority(Thread.MIN_PRIORITY);
② 순환할당 방식 : 시간 할당량을 정해, 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식
- 자바 가상 기계에 의해 정해지기 때문에 코드로 제어 불가반응형'Programming > Java' 카테고리의 다른 글
[Java 자바] 12. 멀티 스레드 ③ 데몬 스레드, 스레드 그룹 (0) 2022.09.12 [Java 자바] 12. 멀티 스레드 ② 동기화, 스레드 상태와 제어 (0) 2022.09.12 [Java 자바] 11. 기본 API 클래스 ⑧ Wrapper(포장), Math, Random 클래스 (0) 2022.09.04 [Java 자바] 11. 기본 API 클래스 ⑦ Arrays 클래스 (0) 2022.09.04 [Java 자바] 11. 기본 API 클래스 ⑥ StringBuffer, StringBuilder 클래스 (0) 2022.09.04