자바 애플리캐이션은     메인(main) 스레드가 main() 메소드를 실행시킨다.

작업 스레드 클래스는 Thread 클래스를 상속 해서 만들 수 있다.

Runnable 객체는 스레드가 실행해야할 코드를 가지고 있는 객체라고 볼 수 있다.


스레드를 만드는  방법,? 종류?

1. 클래스 extends Thread     스레드를 상속받고  run()메소드를 오버라이딩 


2. 클래스 implement Runnable            Runnable을 구현한 클래스를 

다른 곳에서 생성자로 호출     

Thread thread = new Thread(new 클래스 ) 호출



3.  익명객체로 Runnable 구현 (람다식 가능)?



스레드의 우선순위  

우선 순위가 높은 스레드가 실행 기회를 더 많이 가진다.

우선순위는 1~10까지가 있으며 5가 디폴드 값이다.

Thread클래스는 NORM_PRIORITY,  MIN_PRIORITY, MAX_PRIORITY 상수를 제공한다.

1이 가장 낮은 우선수위      10이 제일 높은 우선순위



동기화 메소드와  동기화 블록    synchronized


동기화 메소드와 블록은 단일스레드 환경에선 필요가 없다.

스레드가 동기화 메소드, 블록를 실행 할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.


스레드 일시 정지상태 

일시 정지 상태는  BLOCKED, WAITING, TIMED_WAITING 이있다.

스레드가 동기화 메소드를 실행 할 때  다른 스레드가 다른 동기화 메소드를 호출하게 되면 BLOCKED 상태가 된다.

동기화 메소드내에서 wait()를 호출하면 WAITING 일시정지 상태가 된다.

Sleep() 메소드를 실행 하면 TIMED_WAITING일시 정지 상태가 된다.


 스레드 상태 제어 메소드

yield() 메소드를 호출한 스레드는 동일한 우선 순위나 높은 우선수위의 스레드에게 실행 기회를 양보하고 자신은 실행 대기상태가 된다.

sleep() 메도드를 호출한 스레드는주어진 시간 동안 일시 정지 상태가 된다.

stop() 즉시 스레드를 중지시키기떄문에 스레드에 안정성에 좋지않다. 사용하지 않는게 좋다.

join() 메소드를 호출한 스레드는 일시정지상태가 된다.

interrupt() 를호출하면   일시정지상태    에서  InterruptedException을 발생 시킨다.  
**   (실행 대기 상태에서 호출되면  일시정지 상태가 될 때까지  InterruptedException은 발생하지 않는다.  )

InterruptedException 발생하지 않았다면 , interrupted(), isInterrupted() 메소드는 true를 리턴한다.


public class ThreadExample {
public static void main(String[] args) {

Thread thread = new MovieThread();
thread.start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// interrupt() 실행 일정지가 되면 InterruptedException 발생
thread.interrupt();

}
}
public class MovieThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("동영상을 재생합니다.");
// 방법 1
// Thread.sleep(1000) 일지 정지 상태로 만듬.
// 일시정지가되면 InterruptedException 발생
// catch부분에서 break; 실행
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}

//방법 2
// this.isInterrupted()
if (Thread.interrupted()) {
break;
}

}
}
}

while  문으로 반복저인 작업을 하는 스레드를 종료 시키는 방법 !

조건식에 boolean 타입의 stop 플래그를 이용해서 while 문을 빠져나가게 한다.


스레드가 반복적으로 일시 정지 상태가 된다면 InterruptedException 발생시켜 예외처리 코드에서 break문으로 while 문을 빠져나가게 한다.


스레드가 일시 정지 상태로 가지 않는다면 islnterrupted()  interrupted() 메소드의 리턴값을 조사해서 true 경우 break 문으로 while 문을 빠져나가게 한다.



데몬 스레드

메인 스레드가 종료하면 데몬스레드도 종료

Thread thread = new MovieThread();
Thread.setDaeMon(true);

MovieThread는 데몬스레드가 된다.



스레드풀


 갑작스러운 작업의 증가로 스레드의 폭증을 막기위해 사용된다.


 ExecutorService 객체가 스레드풀이며 newFixedThreadPool0 메소드로 얻을 있다.


작업은 Runnable 또는 Callable 인터페이스를 구현해서 정의한다.


 Future   (지연완료객체, 지연객체)

 Future 스레드가 처리한 작업의 결과값을 얻어 내는  객체이다.


 submit 메소드를 호출하면 즉시 리턴되는 객체이다.


Future get 메소드는 스레드가 작업을 완료하기 전까지 블로킹된다.

 CompletionService 이용하면 작업 완료된 순으로 Future 얻을 있다.





'JAVA > JAVA' 카테고리의 다른 글

제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08
자바 기본 변수  (0) 2018.05.08

+ Recent posts