Ch-13 1~2 [쓰레드]
프로세스와 쓰레드
- 프로세스: 실행 중인 프로그램, 자원과 쓰레드로 구성 (자원: 메모리, cpu…)
- 쓰레드: 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
프로세스 : 쓰레드 = 공장 : 일꾼
- 싱글 쓰레드 프로세스 = 자원 + 쓰레드
- 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + … + 쓰레드
- “하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.”
멀티쓰레드의 장단점
- 대부분의 프로그램이 멀티쓰레드로 작성되어 있다.
장점
- 시스템 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해 진다.
=> “여러 모로 좋다.”
단점
- 동기화에 주의해야 한다.
- 교착상태가 발생하지 않도록 주의해야 한다.
- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
=> “프로그래밍할 때 고려해야 할 사항들이 많다.”
Ch-13 3~6 [쓰레드의 구현과 실행]
1. Thread클래스를 상속
class MyThread extends Thread{
public void run(){
/*작업내용*/
}
}
2. Runnable 인터페이스를 구현
Class MyThread2 implements Runnable {
public void run(){
/*작업내용*/
}
}
> 실행 (1) (2)
MyThread t1 = new MyThread();
t1.start();
Runnable r = new MyThread2()
Thread t2 = new Thread(r);
//= Thread t2 = new Thread(new MyThread2());
t2.start();
쓰레드의 실행 - start()
- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
ThreadEx1_1 t1 = new ThreadEx1_1();
ThreadEx1_1 t2 = new ThreadEx1_1();
t1.start();
t2.start();
start()와 run()
Ch-13 7~13 [싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹]
main 쓰레드
- main메서드의 코드를 수행하는 쓰레드
- 쓰레드는 ‘사용자 쓰레드’와 ‘데몬 쓰레드’(=보조쓰레드) 두 종류가 있다.
실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.
싱글쓰레드와 멀티쓰레드
쓰레드의 I/O 블락킹
(I/O Input/Output)
Ch-13 14~17 [쓰레드의 우선순위, 쓰레드 그룹]
쓰레드의 우선순위
- 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시작을 갖게 할 수 있다.
쓰레드 그룹
- 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것
- 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.
- 쓰레드 그룹을 지정하지 않고 새성한 쓰레드는 'main 쓰레드 그룹'에 속한다.
Ch-13 18~21 [데몬쓰레드, 쓰레드의 상태]
데몬 쓰레드
- 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행
- 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
- 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
Ch-13 22~15 sleep(), interrupt()
sleep()
- 현재 쓰레드를 지정된 시간동안 멈추게 한다.
- 예외처리를 해야 한다.
- 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.
interrupt()
- 대기상태(waiting)인 쓰레드를 실행대기(runnable)상태로 만든다.
Ch13- 26, 27 suspend(), resume()
suspend(), resume(), stop()
- 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
- suspend(), resume(), stop() - deprecated됨.
Ch13- 28, 29 join(), yield()
join()
- 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
yield()
- 남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행대기한다.
Ch13- 30~33 쓰레드의 동기화
- 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다.
- 진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요
쓰레드의 동기화 - 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것
- 동기화하려면 간섭받지 않아야 하는 문장들을 '임계영역' 으로 설정.
- 임계영역은 락을 얻은 단 하나의 쓰레드만 출입 가능 (객체 1개에 락 1개)
(synchronized로 임계영역 설정)
Ch-13 34~36 [wait()과 notify()]
- 동기화의 효율을 높이기 위해 wait(), notify()를 사용
- Object클래스에 정의되어 있으며, 동기화 블록 내에서만 사용할 수 있다.
wait() 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool에 넣는다.
notify() waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다.
notifyAll() waiting pool에서 대기중인 모든 쓰레드를 깨운다.
'공부 > JAVA' 카테고리의 다른 글
[jsp, servlet] Part 2 (6) (1) | 2023.10.28 |
---|---|
231026 자바의정석 (람다식, 함수형 인터페이스, java.util.function, 스트림, 메서드참조 ) (0) | 2023.10.26 |
231024 자바의정석 (애너테이션 타입 정의, 요소) (0) | 2023.10.24 |
1023 공부 (0) | 2023.10.23 |
1020 금요일 (0) | 2023.10.20 |