Thread.join()사용

4972 단어 Java
스 레 드 A 가 thread.join()방법 을 실행 하면 현재 스 레 드 A 는 thread 스 레 드 가 종 료 된 후에 야 thread.join()에서 돌아 온 다 는 것 을 나타 낸다.스 레 드 Thread 는 join()방법 외 에 join(long millis)과 join(long millis,int nanos)두 가지 시간 초과 특성 을 가 진 방법 도 제공 합 니 다.스 레 드 thread 가 주어진 시간 초과 시간 에 종료 되 지 않 으 면 이 시간 초과 방법 에서 돌아 갑 니 다.
public class JoinExample {

    static class Domino implements Runnable{
        private Thread thread;
        public  Domino(Thread thread) {
            this.thread=thread;
        }
        @Override
        public void run() {

            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"    !");

        }

    }
    public static void main(String[] args) throws InterruptedException{
        Thread currentThread = Thread.currentThread();
        for (int i = 0; i <10; i++) {
            //              ,           ,        
            Thread thread = new Thread(new Domino(currentThread),String.valueOf(i));
            thread.start();
            currentThread=thread;
        }
        TimeUnit.SECONDS.sleep(5);
        System.out.println(Thread.currentThread().getName()+",    !");
    }
}

실행 결 과 는 다음 과 같 습 니 다.
main,실행 종료!0 실행 종료!1.실행 종료!2 집행 종료!3.실행 종료!4 집행 종료!5 집행 종료!6 집행 종료!7 집행 종료!8 집행 종료!9 집행 종료!
모든 스 레 드 가 종료 되 는 전 제 는 전구 스 레 드 의 종료 입 니 다.모든 스 레 드 는 전구 스 레 드 가 종 료 된 후에 야 join()방법 으로 돌아 갑 니 다.Thread.join 을 호출 한 코드 설명 을 다시 실행 하면 결 과 는 다음 과 같 습 니 다.
0 실행 종료!3.실행 종료!2 집행 종료!1.실행 종료!5 집행 종료!4 집행 종료!6 집행 종료!7 집행 종료!8 집행 종료!9 집행 종료!main,실행 종료!
Thread.join 의 소스 코드:
  //        
  public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;
        //millis    0
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        //  millis  0,       
        if (millis == 0) {
            //     ,     
            while (isAlive()) {
                wait(0);
            }
        } else {
            //       ,        ,     
            while (isAlive()) {
                //      
                long delay = millis - now;
                //          ,    ,    
                if (delay <= 0) {
                    break;
                }
                //    
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

Thread.join()은 실제 적 으로 Thread.join(long millis)방법 을 호출 했 습 니 다.다만 millis 의 값 은 0 입 니 다.
현재 스 레 드 가 종 료 될 때 스 레 드 자체 의 notify All()방법 을 호출 하여 이 스 레 드 대상 에 기다 리 는 모든 스 레 드 를 알려 줍 니 다.join 방법의 논리 적 결 과 를 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기