Java 09

2017. 2. 5. 22:33Work/Java

728x90
반응형

Thread

-> 작업을 나누어서 실행

1) 다수의 스레드 생성

스레드 생성

- 생성자 Thread(String name)

class MyThread extends Thread{

MyThread(String str){

super(str); // 자식 스레드 이름 부여

}

public void run() { // 자식 스레드가 할일 }

}

- 생성자 Thread(Runnable threadObj)

class Run1 implements Runnable{

public void run() { // 자식 스레드가 할일 }

}

Thread t = new Thread(new Run1());

t.start();

t.join(); // 스레드 종결 기다림

-> Runnable은 interface이다.

-> 스레드가 해야 할 일은 메소드 run()에 정의

2) 동기화(Synchronization) => 두 스레드가 하나의 동작 필요시 서로 순서를 지켜가며 수행

3) 스레드끼리 정보 교환(inter-thread Communication)


main thread => Default


스레드 우선 순위 (Priority)

final void setPriority(int p) // p 는 1~10까지 

final int hetPriority()

-> 우선 순위가 높은 스레드에게 CPU를 오랫동안 점유


각 용어들

테스크(Task)

일 혹은 작업, 프로세스와 스레드까지 의미

_스레드 : 하나의 프로세스를 실행하면 하나의 스레드가 실행되며 이 스레드를 메인 스레드(Main Thread)라고 하고 프로세스가 시작 된다. 프로세스 내부에 1개의 스레드만 존재하면 Single(단일) Thread Process 라고 하며 여러 개의 스레드가 동작하는 것을 Multi(다중) Thread Process 라고 한다.

-> 스레드 상태 전이도

- Create -> Runnable <-> Running -> Done

- Create -> Runnable <- Waiting, Blocked

- Create -> Runnable -> Running -> Waiting, Blocked

> Create

Thread 객체를 인스턴스 했을 때

> Runnable

인스턴스된 스레드 객체의 start() 메소드가 호출 되었을 때

> Running

run() 메소드가 실행 되었을 때

> Waiting, Blocked

실제 동작하고 있지 않는 상태 notify() 메소드에 의해 다시 깨어날 수 있고 깨어난 스레드는 Runnable 상태로 변경 

프로세스(Process)

OS로 부터 자원을 할당받아 동작하는 독립된 프로그램

멀티 프로세싱(Multi Processing)

여러 개의 CPU 프로세스가 서로 협력하여 작업 병행 처리

멀티 테스킹(Multi Tesking)

태스크(일)을 병렬 처리, 스케줄링을 이용한 병렬 처리

멀티 스레딩(Multi Threading)

하나의 프로그램(프로세스)에서 여러 개의 스레드가 실행되는 것, 자원을 공유할 수 있으므로 가볍고 각각의 스레드를 제어할 수 있기 때문에 성능을 향상시킬 수 있다.

병행 처리

여러 작업이 순차적으로 처리되는 방식과 동시에 병렬로 처리되는 방식을 포괄하는 의미

인터럽트가 발생 했을 경우

-> 인터럽트 발생 시 스레드가 종료 되도록 구현해야 한다.


Thread Group

ThreadGroup [객체 이름] = new ThreadGroup( [String 이름] );

ThreadGroup [객체 이름] = new ThreadGroup( [ThreadGroup 부모],                                                              [String 이름] );

- setMaxPriority() 메소드

스레드 그룹에 속한 모든 스레드들의 수선순위 제한

- destroy() 메소드

그룹에 속한 모든 스레드가 종료되고 소멸해야 할 때 사용, 가비지 컬렉터가 종료된 스레드 자동 수집 하지 않음

- isDestroy() 메소드

해당 스레드 그룹에서 destroy() 메소드가 호출된 경우 true 반환

- setDaemon() 메소드

그룹에 속한 모든 스레드 또는 스레드 그룹을 데몬으로 설정, 데몬으로 설정된 경우 마지막 스레드 종료시 자동으로 destroy 수행

- interrupt() 메소드

그룹에 속한 스레드 전체에 interruptException 발생

- enumerate() 메소드

ThreadGroup thGroup = Thread.currentThread().getThreadGruoup();

Thread[] thArray = new Thread[thGroup.activeCount()]; // 현재 active 상태의 스레드 개수로 배열을 초기화

thGroup.enumerate(thArray);

그룹에 속한 스레드들 중 동작 중인 스레드들을 배열에 넣는 역할, 매개 변수로 Thread[] 배열을 받는다.

-> 비슷한 유형의 스레드를 한번에 제어하기 위해 사용, JVM에 의해 생성되는 시스템 스레드 그룹은 사용 불가


Thread Synchronization

- 스레드가 공유 자원에 대한 사용이 끝날 때까지 다른 스레드가 접근하지 못하도록 제한

- 이것을 '상호 배타적 처리', 공유 자원을 상호 베타적으로 처리 하는 방법

- 동기화는 오직 하나의 스레드만이 공유 자원에 대한 접근을 허락

- 스레드가 동기화된 영역을 먼저 점유했다면 다른 스레드가 접근할 수 없도록 한다. (이런 상황을 '락(Lock) 걸었다' 라고 표현 한다.), 하나의 락은 하나의 스레드만 획득할 수 있다.

동기화 메소드

[제어자] synchronized [반환값] [메소드 이름]() { //공유 자원 변경}

public synchronized void synMethod() {}

동기화 블록

[메소드 선언부]{

synchronized([락 객체]){ // 공유 자원 변경 }

public void synMethod() {

synchronized(this) { }

}

- 메모리의 부담을 최소화하기 위해서 Object 클래스 객체를 사용, 일반적으로 락 객체는 private 키워드로 선언해 다른 객체에 의해 변경되지 않도록 한다.

public class ThreadLock(){

private Object lockObj = new Object();

public void testLock(String name){

synchronized(lockObj){}

}

-> 스레드 동기화, 멀티 스레딩과 바로 직결, 멀티 스레딩을 사용해서 보다 빠른 작업을 처리, 동기화의 부작용으로 먼저 락을 획득한 스레드가 락을 해지할 때까지 다른 스레드의 접근을 허용하지 않는 병목 현상이 발생한다.


Producer-Consumer 패턴 (멀티 스레드 디자인 패턴)

- 프로듀서(Producer)

처리해야할 작업이나 지속적으로 생성하는 역할, 생성하는 작업들을 Queue에 계속해서 쌓는 역할만 담당

- 작업 Queue

FIFO로 구현된 형태, 작업을 관리하는 역할을 담당

- 컨슈머(Consumer)

직접 작업을 처리하는 역할을 담당, Queue에서 할당 받아야 한다.

-> 멀티 스레드를 구현하는 여러 패턴 중에서 가장 일반적인 패턴, 하나의 producer가 리소스를 만들고 두 개 이상의 consummer가 리소스를 처리하도록 되어 있다.

Polling

-> 지속적으로 이벤트가 발생하는지 감시

Interrupt

-> 비동기적으로 이벤트가 발생한 순간 수행중인 작업을 멈추고 인터럽트 서비스 루틴으로 복귀하는 방식


스레드를 제어하는 wait(), notify(), notifyAll() 메소드

- wait

스레드는 동작일 일시 정지하고 wait 셋에 들어간다.

- notify(), notifyAll()

wait 셋에 대기 중인 스레드를 깨운다.

728x90
반응형

'Work > Java' 카테고리의 다른 글

Java 11  (1) 2017.02.13
Java 10  (0) 2017.02.10
Java 08  (0) 2017.02.04
Java 07  (0) 2017.02.03
Java 06  (0) 2017.02.01