자바 스 레 드 상태 와 깨 우기 메커니즘 과 스 레 드 탱크 의 실현 을 기다 리 고 있 습 니 다.

1.개념
스 레 드 는 모두 6 중 상태 로 서로 전환 할 수 있 습 니 다.

깨 우기 사례 대기(스 레 드 간 통신)

실현:
깨 우기 대기 사례:스 레 드 간 통신
고객 스 레 드 만 들 기(소비자):사장 이 원 하 는 만두 의 종류 와 수량 을 알려 주 고 wait 방법 을 사용 하여 cpu 의 실행 을 포기 하고 WAITING 상태 로 들 어 갑 니 다(무한 대기)
사장 스 레 드 만 들 기(생산자):5 초 동안 만 두 를 만 들 고 만 두 를 만 든 후에 notify 방법 으로 고객 에 게 만 두 를 먹 으 라 고 깨 웠 습 니 다.
주의:
고객 과 사장 스 레 드 는 동기 코드 블록 으로 감 싸 야 합 니 다.대기 와 깨 우기 가 한 개 만 실 행 될 수 있 도록 해 야 합 니 다.
동기 화 된 잠 금 대상 은 유일 해 야 합 니 다.
잠 금 대상 만 wait 와 notify 방법 을 호출 할 수 있 습 니 다.
Obejct 클래스 의 방법
void wait()
다른 스 레 드 에서 이 대상 의 notify()방법 이나 notify All()방법 을 호출 하기 전에 현재 스 레 드 가 기 다 립 니 다.
void notify()
이 대상 모니터 에서 기다 리 는 단일 스 레 드 를 깨 웁 니 다.
wait 방법 을 계속 실행 한 다음 코드 입 니 다.
TimeWaiting(타이머 대기)에 들 어 가 는 방법 은 두 가지 가 있 습 니 다.
1.sleep(long m)방법 을 사용 하여 밀리초 값 이 끝 난 후 스 레 드 가 잠 에서 깨 어 Runnable/Blocked 상태 로 들 어 갑 니 다.
2.wait(long m)방법 을 사용 합 니 다.wait 방법 은 밀리초 값 이 끝 난 후에 도 notify 에 의 해 깨 어 나 지 않 으 면 자동 으로 깨 어 납 니 다.스 레 드 는 잠 에서 깨 어 Runnable/Blocked 상태 로 들 어 갑 니 다.
깨 우 는 방법:
void notify()이 대상 모니터 에서 기다 리 는 단일 스 레 드 를 깨 웁 니 다.
void notify All()이 대상 모니터 에서 기다 리 는 모든 스 레 드 를 깨 웁 니 다.

public static void main(String[] args) {
  //     ,    
  final Object obj = new Object();
  //         (   )
  new Thread(){
    @Override
    public void run() {
      //       
      while(true){
        //                 ,        
        synchronized (obj){
          System.out.println("  1              ");
          //  wait  ,  cpu   ,   WAITING  (    )
          try {
            obj.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          //         
          System.out.println("       ,  1  !");
          System.out.println("---------------------------------------");
        }
      }
    }
  }.start();

  //         (   )
  new Thread(){
    @Override
    public void run() {
      //       
      while(true){
        //                 ,        
        synchronized (obj){
          System.out.println("  2              ");
          //  wait  ,  cpu   ,   WAITING  (    )
          try {
            obj.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          //         
          System.out.println("       ,  2  !");
          System.out.println("---------------------------------------");
        }
      }
    }
  }.start();

  //        (   )
  new Thread(){
    @Override
    public void run() {
      //     
      while (true){
        //  5    
        try {
          Thread.sleep(5000);// 5     
        } catch (InterruptedException e) {
          e.printStackTrace();
        }

        //                 ,        
        synchronized (obj){
          System.out.println("  5        ,    ,      ");
          //      ,  notify  ,       
          //obj.notify();//         ,      
          obj.notifyAll();//         
        }
      }
    }
  }.start();
}

2.깨 우기 메커니즘 을 기다린다
한 스 레 드 에서 규정된 작업 을 한 후에 대기 상태(wait()에 들 어가 다른 스 레 드 가 지정 한 코드 를 실행 한 후에 notify()를 깨 우 는 것 입 니 다.여러 스 레 드 가 기다 리 고 있 을 때 필요 하 다 면 notify All()을 사용 하여 모든 대기 스 레 드 를 깨 울 수 있 습 니 다.wait/notify 는 스 레 드 간 의 협력 체제 이다.
각성 을 기다 리 는 방법:
  • wait:스 레 드 가 더 이상 활동 하지 않 고 스케줄 에 참여 하지 않 으 며 wait set 에 들 어가 기 때문에 CPU 자원 을 낭비 하지 않 고 경쟁 잠 금 을 하지 않 습 니 다.이때 스 레 드 상 태 는 바로 WAITING 입 니 다.다른 스 레 드 가 특별한 동작 을 수행 할 때 까지 기 다 려 야 합 니 다.즉,'알림(notify)'이 대상 에서 기다 리 는 스 레 드 가 wait set 에서 방출 되 고 스케줄 러(ready quue)에서
  • 으로 다시 들 어 갑 니 다.
  • notify:알림 대상 의 wait set 중의 한 스 레 드 를 선택 하여 방출 합 니 다.예 를 들 어 식당 에 빈 자리 가 있 으 면 가장 오래 식 사 를 기다 리 는 고객 이 가장 먼저 자리 에 앉는다.
  • notify All:알림 대상 의 wait set 의 모든 스 레 드 를 방출 합 니 다.
  • 3.스 레 드 탱크
    스 레 드 탱크 는 여러 개의 스 레 드 를 수용 하 는 용기 입 니 다.그 중의 스 레 드 는 반복 적 으로 사용 할 수 있 고 스 레 드 대상 을 자주 만 드 는 작업 을 줄 일 수 있 으 며 스 레 드 를 반복 적 으로 만 들 지 않 아 도 너무 많은 자원 을 소모 할 수 있 습 니 다.

    자바 안의 스 레 드 탱크 의 최상 위 인 터 페 이 스 는 java.util.concurrent.Executor 이지 만 엄격 한 의미 에서 Executor 은 스 레 드 탱크 가 아니 라 스 레 드 를 실행 하 는 도구 일 뿐이다.진정한 스 레 드 탱크 인 터 페 이 스 는 java.util.concurrent.ExecutorService 이다.스 레 드 탱크 를 배치 하 는 것 은 비교적 복잡 하 다.특히 스 레 드 탱크 의 원리 가 명확 하지 않 은 상황 에서 배치 할 수 있 는 스 레 드 탱크 가 비교적 좋 지 않 기 때문에 java.util.concurrent.Executors 스 레 드 공장 류 에서 정적 공장 을 제공 하여 자주 사용 하 는 스 레 드 탱크 를 생 성 했다.공식 적 으로 Executors 프로젝트 클래스 를 사용 하여 스 레 드 탱크 대상 을 만 들 것 을 건의 합 니 다.
    사용:
    채널:JDK 1.5 이후 제공 되 는
        java.util.concurrent.Executors:스 레 드 탱크 의 공장 류,스 레 드 탱크 생 성
        Executors 클래스 의 정적 방법:
            static ExecutorService newFixedThreadPool(int nThreads)고정 스 레 드 수 를 다시 사용 할 수 있 는 스 레 드 풀 을 만 듭 니 다.
            인자:
                int nThreads:스 레 드 탱크 에 포 함 된 스 레 드 수량 만 들 기
            반환 값:
                ExecutorService 인 터 페 이 스 는 ExecutorService 인터페이스의 실현 대상 을 되 돌려 줍 니 다.저 희 는 ExecutorService 인 터 페 이 스 를 사용 하여 수신 할 수 있 습 니 다(인터페이스 프로 그래 밍)
        java.util.concurrent.Executor 서비스:스 레 드 탱크 인터페이스
            스 레 드 탱크 에서 스 레 드 를 가 져 오고 start 방법 을 호출 하여 스 레 드 작업 을 수행 합 니 다.
                submit(Runnable task)실행 에 사용 할 Runnable 작업 제출
            스 레 드 풀 을 닫 거나 없 애 는 방법
                void shutdown()
    스 레 드 탱크 의 사용 절차:
    1.스 레 드 탱크 의 공장 류 Executors 에서 제공 하 는 정적 방법 new Fixed ThreadPool 을 사용 하여 지정 한 스 레 드 수량의 스 레 드 탱크 를 생산 합 니 다.
    2.클래스 를 만 들 고 Runnable 인 터 페 이 스 를 실현 하 며 run 방법 을 다시 쓰 고 스 레 드 작업 을 설정 합 니 다.
    3.ExecutorService 의 방법 submit 를 호출 하여 스 레 드 작업(실현 클래스)을 전달 하고 스 레 드 를 켜 고 run 방법 을 실행 합 니 다.
    4.ExecutorService 의 방법 shutdown 을 호출 하여 스 레 드 풀 을 제거 합 니 다(실행 을 권장 하지 않 음)
    예:
    
    public class RunnableImpl implements Runnable{
      @Override
      public void run() {
        System.out.println(Thread.currentThread().getName()+"           ");
      }
    }
     
    public static void main(String[] args) {
      //1.         Executors         newFixedThreadPool              
      ExecutorService es = Executors.newFixedThreadPool(2);
      //3.  ExecutorService    submit,      (   ),    ,  run  
      es.submit(new RunnableImpl());//pool-1-thread-1           
      //        ,      ,            ,        
      es.submit(new RunnableImpl());//pool-1-thread-1           
      es.submit(new RunnableImpl());//pool-1-thread-2           
    
      //4.  ExecutorService    shutdown     (     )
      es.shutdown();
    
      es.submit(new RunnableImpl());//   ,       ,        
    }

    자바 스 레 드 상태 와 깨 우기 메커니즘 과 스 레 드 풀 의 실현 을 기다 리 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 스 레 드 상태 와 깨 우기 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 을 바 랍 니 다!

    좋은 웹페이지 즐겨찾기