ch12. 스레드

728x90

ch12. 스레드

12-1. 멀티 스레드

[프로세스]

: 운영체제에서 실행 중인 하나의 애플리케이션

: 운영체제로부터 메모리 할당받아 애플리케이션 실행

  • 단일 프로세스 : 하나의 애플리케이션 내부, 단 하나의 프로세스
  • 멀티 프로세스 : 하나의 애플리케이션 내부, 多 프로세스

[스레드]

: 하나의 작업 실행에 필요한 하나의 코드 실행 흐름

: 멀티 스레드 생성 -> 병렬로 실행 -> 멀티 태스킹 수행 O

  • 싱글 스레드 ; 하나의 프로세스 내부, 단 하나의 메인 스레드
  • 멀티 스레드 : 하나의 프로세스 내부, 메인 스레드 1개 + 여러 개의 작업 스레드 들

[멀티 프로세스 VS 멀티 스레드 비교]

🟨멀티 프로세스 : 독립적 실행

: 각 프로세스가 운영체제에서 자신의 메모리를 할당받아 실행하므로

각 프로세스는 서로 독립적이다. 하나의 프로세스의 오류가 또 다른 프로세스에 영향 X

🟨멀티 스레드 : 종속적 실행

: 하나의 프로세스 내부에 멀티 스레드가 생성되므로,

하나의 스레드 예외발생 시 -> 다른 스레드들 영향 미침

[메인 스레드] : 1개

: main() 메소드 첫 코드 ~ 마지막 코드까지의 작업 코드 실행 단위

: 자바의 모든 애플리케이션은 메인 스레드가 main() 메소드 실행하면서 시작됨

[작업 스레드] : 多 개

: 메인 스레드 외에, 메인 스레드와 병렬로 동시 실행되어야 할 작업들을 분류하고,

각 작업별로 작업 스레드 생성하여 동시 작업 수행 가능케 함

: 작업 스레드들을 여러 개 만들어 병렬로 코드 실행시키면, 멀티 스레드 생성되어 멀티태스킹 가능

[1] 작업 스레드의 객체 생성

구현 클래스, 자식 클래스는 각각 내부의 run() 메소드 재정의해서 생성

→ 스레드.start() 메소드로 작업 스레드 + 메인 스레드 동시 실행됨

1) Thread 클래스로부터 작업 스레드 직접 생성

: Thread 타입 <- Thread 객체 생성자 (매개값)에 구현 객체 대입

Thread thread = new Tread ( 구현 객체 ) ;

(1). 별도의 구현 클래스 생성 후, 구현 객체 생성 -> 대입

class Task **implements Runnable** { ... } //매개값 줄 용도로 객체 생성

Thread thread = new Thread(**Task**); //작업 스레드 객체 생성

(2). 익명 구현 객체 생성 후 -> 즉시 Thread 타입에 대입 연결

Thread thread = new Thread **( new Runnable() { ... }** **);**

2) Thread 자식 클래스로부터 작업 스레드 생성

: Thread thread 타입 <- 자식 객체 생성자 연결

Thread thread 타입 = new 자식 객체 생성자() ;

(1). 별도의 자식 클래스 생성 후, 자식 객체 생성

class Task **extends Thread** { ... }

Thread thread = new **Task();**

OR 이미 자체로 Tread 상속받은 자식 클래스라 꼭 Tread타입 연결없이도 객체 생성해도 스레드 객체생성O

User1 user1 = new User1();

(2). 익명 자식 객체 생성 후, 즉시 Thread 타입에 대입 연결

Thread thread = new Thread () **{ ... };**

[2] 스레드의 이름

메인 스레드 이름 : ‘main’

작업 스레드 이름 : ‘Thread-n’

스레드 이름 재설정 : thread.setName(“이름”);

스레드 이름 읽기 : thread.getName();

현재 스레드 객체의 참조 얻기

Thread thread = Thread.currentThread();

: setName(), getName() 은 Thread 클래스의 인스턴스 메소드이므로 각각의 스레드 객체 참조가 필요하다.

[3] 동기화 메소드 : synchronized 키워드 + 메소드 선언

: 여러 스레드 사용 중인 공유 객체 속에 동기화 메소드 정의해둘 경우,

어느 스레드 하나가 해당 동기화 메소드 실행 동안은 공유객체 자체 잠금 처리됨

: 멀티 스레드 프로그램에서 스레드들이 객체 공유 작업 시 동기화 메소드 사용

: 하나의 스레드가 사용 중인 공유 객체에 다른 스레드가 접근할 수 없도록 하기 위함

임계영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역

: 임계영역 지정 위해 동기화 메소드 사용

하나의 스레드가 동기화 메소드 실행 시, 해당 공유 객체 자체 즉시 잠금 처리
--> 동기화 메소드 종료 시 잠금 해제되어 다른 스레드 접근 가능해짐

동기화 메소드 여러 개일 경우 한 스레드가 동기화 메소드 하나 실행 중 -> 다른 스레드는 해당 동기화 메소드 X
-> 다른 스레드가 다른 동기화 메소드도 실행 X
-> But> 다른 메소드가 다른 일반 메소드는 실행 가능 O

public synchronized void setMemory(int memory) { 
    ... 임계영역 ; // 단 하나의 스레드만 실행 가능한 여역
    }

12-2. 스레드 제어

[스레드 상태]

: 스레드는 실행 대기 상태와 실행 상태 번갈아가면서 run() 메소드 조금씩 실행함

: 일시 정지 상태에서는 바로 실행 상태로 돌아갈 수 없고 -> 실행 대기 상태로 감

  • 실행 대기 상태 : start() 호출된 스레드는 일단 실행 대기 상태
  • 실행 상태

:운영체제가 선택한 스레드

  • run() 메소드 모두 실행되기 전 // 실행 상태, 실행 대기 상태 번갈아 가며 run() 조금씩 실행
  • 일시 정지 상태 // Tread.sleep() 호출 시 일정 시간 정지 상태 -> 실행 대기 상태
  • 종료 상태

1) run() 메소드 모두 실행되어 종료되면 // 일반 정상 종료 상태

2) 안전하게 중간 종료

➡️(1) stop 플래그 이용 : setStop() 메소드로 stop T값 변경하여 정상 종료

➡️(2) interrupt() 이용 : 일시 정지 상태에서만 효과 O (예외처리catch블록이동)

[스레드 상태 제어]

: 실행 중인 스레드의 상태를 변경하는 것

< 스레드 상태 제어 메소드 종류>

sleep( ) ; // 주어진 시간동안 일시 정지 상태. 시간 지나면 자동 실행 대기 상태

interrupt() ; // 일시정지상태 스레드에 한해 -> 예외 발생시켜 -> catch블록 이동 
        -> while문 탈출하여 정상 종료 
stop() ; // 비정상 종료 사용 X

< 스레드의 안전한 종료 >

1) run() 메소드 모두 실행되어 종료되면 // 일반 정상 종료 상태

2) 안전하게 중간 종료

➡️(1) stop 플래그 이용 : setStop() 메소드로 stop T값 변경하여 정상 종료

➡️(2) interrupt() 이용 : 일시 정지 상태에서만 효과 O (예외처리catch블록이동)

  • 1) Thread.sleep(1); // 일부러 짧게 일시정지 상태 만들어 interrupt() 호출
  • 2) 호출 여부 확인 메소드 -> if문 이용 -> break; 정상 탈출
// Thread.interrupted() : 정적 메소드, 현재 스레드 interrupted 확인

// Thread.isInterrupted() ; 인스턴스 메소드. 현재 스레드 intterrupted 확인

[데몬 스레드]

: 주 스레드의 작업을 돕는 보조역할 스레드

: 주 스레드 종료되면 데몬 스레드 자동 강제 종료

: start() 메소드 호출 전 setDaemon(true); 호출해야 에러X

: 어떤 스레드를 데몬으로 만들 스레드 객체 생성 후, setDaemon(true); 호출하면

→ 해당 스레드가 데몬 스레드로 지정됨

728x90

'Java > [문법]_Java(자바)' 카테고리의 다른 글

ch14. 입출력 스트림  (0) 2021.08.24
ch13. 컬렉션 프레임워크  (0) 2021.08.23
11-1. java.lang 패키지  (0) 2021.08.11
ch10. 예외 처리  (0) 2021.08.05
ch09. 중첩 클래스와 중첩 인터페이스  (0) 2021.08.05