본문 바로가기
공부/JAVA

231025 자바의정석 (쓰레드)

by 예림220 2023. 10. 25.

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에서 대기중인 모든 쓰레드를 깨운다.