- 프로세스와 쓰레드
프로세스: 실행 중인 프로그램, 자원(메모리, 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 |