본문 바로가기
JAVA

쓰레드

by moonstal 2022. 3. 10.

- 프로세스와 쓰레드

  프로세스: 실행 중인 프로그램, 자원(메모리, cpu)과 쓰레드로 구성

  쓰레드: 프로세스 내에서 실제 작업 수행 모든프로세스는 최소 하나의 쓰레드

  프로세스:쓰레드=공장:일꾼

  하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더적은 비용이 든다.

 

- 멀티쓰레드 장단점

  장점: 자원을 효율적, 응답성 향상, 코드간결

  단점: 동기화주의, 교착상태주의, 각쓰레드 효율적으로 실행하도록 고려

 

- 쓰레드의 구현과 실행

  Thread클래스 상속 run()구현

MyThread t = new MyThread();
t.start();

  Runnable인터페이스 구현 (이게더 좋음)  run()구현

Runnable r = new MyThread();
Thread t= new Thread(r);
//Thread t= new Thread(new MyThread());한줄로
t.start();

- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.

- start()가 새로운 호출 스택 생성-> run() 실행

 

- main 쓰레드

  main메서드의 코드를 수행하는 쓰레드

  쓰레드는 사용자쓰레드와 데몬쓰레드(보조) 두종류가 있다.

  실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.

 

- 쓰레드의 I/O 블락킹(입출력시 작업중단)

  싱글쓰레드 입력받을때 작업 멈춤->멀티쓰레드로 동시작업

 

- 쓰레드 우선순위

  작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더많은 작업 최대10 보통5 최소1

 

- 쓰레드 그룹

  서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것

  모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.

  쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 main쓰레드 그룹에 속한다.

 

- 데몬쓰레드

  일반쓰레드의 작업을 돕는 보조적인 역할을 수행

  일반쓰레드가 모두 종료되면 자동적으로 종료

  가비지 컬렉터, 자동저장, 화면 자동갱신

  무한루프와 조건문을 이용해서 실행후 대기하다가 특정조건이 만족되면 작업 수행하고 다시 대기

  t.setDaemon(true);

  t.start();

 

- 쓰레드의 실행제어

  쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.

 

- static 자기자신만 실행제어 sleep() yield()양보

- sleep()

  현재 쓰레드를 지정된 시간동안 멈추게 한다. 

  예외처리 필수

  특정쓰레드를 지정해서 멈추게 하는 것은 불가능하다.

 

- interrupt(): 대기상태인 쓰레드를 실행대기 상태로 만든다.

- suspend()쓰레드 실행 일시정지, resume() 재개, stop()완전정지  -권장안함 교착상태발생

- join(): 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.

- yield(): 남은 시간을 다음 쓰레드에게 양보하고, 자신은 실행대기한다.

 

- 쓰레드의 동기화

  멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다.

  진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요

  쓰레드 동기화: 한쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는것

  동기화하려면 간섭받지 않아야 하는 문장들을 '임계영역'으로 설정

  임계영역은 락을 얻은 단 하나의 쓰레드만 출입가능(객체 1개에 락1개)

  임계영역 메서드 전체/ 특정 영역-synchronized

 

- wait()과 notify()

  동기화의 효율을 높임

  동기화 블록내에서 사용

  구분안됨->lock&condition

'JAVA' 카테고리의 다른 글

접근제어자와 static  (0) 2022.03.30
람다와 스트림  (0) 2022.03.10
지네릭스, 열거형, 애너테이션  (0) 2022.03.09
컬렉션 프레임웍  (0) 2022.03.08
날짜와 시간 & 형식화  (0) 2022.03.08