728x90
멀티스레드
- 멀티 프로세스 : 독립적 (할당받은 메모리를 통해 실행)
- 멀티 스레드 : 독립적 x (하나의 프로세스 내부에 생성)
메인 스레드
- 반드시 존재
- main() 메소드를 실행하면서 시작
- 싱글 스레드에서는 메인 스레드 종료시 프로세스 종료
- 멀티 스레드는 작업 스레드가 계속 실행 중이면 프로세스 종료 x
작업 스레드 생성
-
- Thread 클래스로부터 직접 생성
- Runnable : 작업 스레드가 실행하는 코드를 갖고 있는 객체
- Runnable : 인터페이스 타입 → 구현 객체를 직접 만들어야함
- Runnable ⊃ run() → 재정의
- Runnable은 작업 내용을 가지고 있는 객체. (실제 스레드는 아님)
- Runnable 인터페이스
- Thread 클래스로부터 직접 생성
class subThread implements Runnable { public void run() { /* 소스코드 실행 내용 */ } }
방법 1. Runnable 클래스 정의
import java.awt.Toolkit;
public class BeepTask implements Runnable{
public void run(){
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i=0; i<5; i++){
toolkit.beep();
try {
Thread.sleep(500);
}
catch (Exception err){}
}
}
}
Runnable beepTask = new BeepTask();
Thread thread = new Thread(beepTask);
- Runnable 클래스를 정의
- 메인 스레드에서 Runnable 객체를 생성
- 메인 스레드에서 Thread 객체를 생성
- Thread 객체를 시작
방법 2. 익명 객체 이용
- 메인 스레드 내부에서 Runnable 객체 정의 → Runnable 객체 생성 → Thread 객체 생성
- 모두를 하는 방법
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
}
}
});
- Thread 객체 생성
- 파라미터로 Runnable 객체 생성
- Runnable 객체 내부에 run() 메소드 오버라이딩하여 작성
- 파라미터로 Runnable 객체 생성
- Thread 객체 시작
방법 3. 람다식 이용
- Runnable 객체 생성을 run() 메소드 정의 하나로 통합하는 방법
Thread thread = new Thread(() -> {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
}
});
방법 4. Thread 클래스 상속
- Thread 클래스 상속 받아서 run() 메소드 오버라이딩
import java.awt.*;
public class BeepThread extends Thread {
public void run() {
Toolkit tookit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 5; i++) {
tookit.beep();
try {Thread.sleep(500);}
catch (Exception err) {}
}
}
}
Thread thread = new BeepThread();
방법 5. Thread 객체 자체를 재정의
Thread thread = new Thread() {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
}
}
};
스레드 이름
-
- 디버깅 과정에서 각 스레드가 하는 작업 조사에 용이
- 자동적으로
Thread-n
으로 설정 - 스레드 이름 설정
thread.setName("스레드 이름");
- 스레드 이름 알기
thread.getName();
- 현재 스레드 참조 획득
Thread thread = Thread.currentThread();
스레드 우선순위
- 동시성, 병렬성, 스레드 스케줄링
- 병렬성 : 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
- 동시성 : 개별 스레드를 동시에 실행하는 성질
- 우선 순위, 순환 할당
- 우선 순위 : 우선 순위가 높은 스레드가 실행 상태를 더 많이 가져감
- 순환 할당 : 정해진 time slice만큼 실행 후 다른 스레드 실행
- 우선 순위 방식
- 우선 순위를 부여하지 않으면 기본적으로
5
의 우선 순위 할당
thread.setPriority(우선순위); thread.setPriority(Thread.MAX_PRIORITY); // 10 thread.setPriority(Thread.MIN_PRIORITY); // 1 thread.setPriority(Thread.NORM_PRIORITY); // 5
- 우선 순위를 부여하지 않으면 기본적으로
동기화 메소드, 동기화 블록
- 임계 영역(critical section) : 단 하나의 스레드만 실행할 수 있는 코드 영역
- 동기화 메소드
public synchronized void method() { /* 임계 영역 */ }
- 동기화 블록
public void method() { ... synchronized() { /* 임계 영역 */ } ... }
- 스레드가 동기화 메소드 실행 시 잠금 발생 → 실행 종료 시, 잠금 해제
- 동기화 메소드
스레드 상태
- 객체 생성
- NEW
- 실행 대기
- RUNNABLE
- 일시 정지
- WAITING
- TIMED_WAITING
- BLOCKED
- 종료
- TERMINATED
728x90
'🧑💻 Language > Java' 카테고리의 다른 글
[Java] Basic Java (2) (0) | 2022.04.04 |
---|---|
[Java] Basic Java (1) (0) | 2022.03.29 |
[Java] 14. 스윙 (0) | 2021.06.05 |
[Java] 13. GUI (0) | 2021.06.01 |
[Java] 12. 모듈화와 패키지 응용 (2) | 2021.06.01 |