가입은 문자 그대로 가입을 의미합니다. 조인 메소드의 설명과 구현을 살펴 보겠습니다.
/***이 스레드가 죽을 때까지 기다립니다. * 발신자 스레드 (결합 메서드를 호출하는 스레드)는 호출 된 스레드 (결합 메소드가 속한 스레드)가 끝나고 다시 깨어날 때까지 대기 작업을 수행합니다. 이 예외가 발생하면 현재 스레드의 * <i> 중단 상태가 지워집니다. */ public final void join ()가 throws InterruptedException {join (0); }여기에서 가입이 호출됩니다
/** *이 스레드가 * 다이를 위해 최대 {@code millis} millions를 기다립니다. {@code 0}의 시간 초과는 스레드 실행이 종료되기를 기다리는 것을 의미합니다. 또는 지정된 최대 대기 시간이 도착하면 발신자의 스레드가 다시 깨어납니다. 최대 대기 시간이 0 인 경우 깨어나 기 전에 스레드 실행이 종료 될 때까지 기다릴 수 있습니다. * <p>이 구현은 {@code this.isalive}에 조절 된 {@code this.wait}의 루프를 사용합니다. 스레드가 끝나면 * {@code this.notifyall} 메소드가 호출됩니다. * 응용 프로그램은 {@code wait}, {@code notify} 또는 * {@code notifyall}을 사용하지 않는 것이 좋습니다. * * */ public final synchronized void join (long millis)은 InterruptedException {long base = system.currenttimemillis (); 지금은 지금 = 0; if (millis <0) {새로운 불법 불법 행위 ( "타임 아웃 값은 음수"); } if (millis == 0) {while (isalive ()) {대기 (0); }} else {while (isalive ()) {long delay = millis- 지금; if (지연 <= 0) {break; } 대기 (지연); now = system.currenttimeMillis () -베이스; }}} 결합 메소드 자체가 대기 방법을 대기하는 것을 구현한다는 것을 알 수 있습니다. 스레드가 여전히 실행중인 경우 계속 기다리십시오. 지정된 시간이 오거나 스레드가 실행 된 경우 코드가 계속 아래로 실행되고 호출 스레드가 후속 로직을 실행할 수 있습니다.
그러나 여기서는 알림 또는 Notifyall 메소드를 어디에 호출 해야하는지 알 수 없습니다. 호출되지 않으면 발신자 스레드가 계속 기다립니다. 그것을 깨우는 방법은 어디에 있었습니까? 검증을 통해 스레드가 종료되면 Java Virtual Machine이 스레드의 로컬 종료 방법을 실행하는 것으로 나타났습니다.
// 스레드 종료 함수 : void javathread :: exit (bool destry_vm, exittype exit_type) {... // 이것은 조인 관련 파괴 로직 보수 안수 _join (...} // 조인 관련 파괴 로직 정적 void inrist_join (javathread* thread) {스레드, 스레드-(스레드) (thread,> threadobj); ObjectLocker Lock (ThreadObj, Thread); 스레드-> clear_pending_exception (); java_lang_thread :: set_thread_status (ThreadObj (), java_lang_thread :: 종료); java_lang_thread :: set_thread (threadobj (), null); // 여기서 우리는 대기 스레드 잠금을 깨우기 위해 notifyall 메소드를 호출합니다. notify_all (스레드); 스레드-> clear_pending_exception (); }이것은 스레드가 깨어날 때를 이해할 것입니다. 효과를 보려면 아래 예제를 작성해 봅시다.
공개 클래스 공동 {public static void main (String [] args) {Threadboy Boy = new ThreadBoy (); boy.start (); } 정적 클래스 스레드 보이 스레드 {@override public void run () {System.out.println ( "소년과 소녀가 쇼핑 할 준비가되었습니다"); ThreadGirl girl = new ThreadGirl (); girl.start (); try {girl.join (); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "소년과 소녀는 쇼핑을 시작합니다"); }} static class strandgirl은 스레드 {@override public void run () {int time = 5000; System.out.println ( "소녀는 화장을 시작하고 소년이 기다리고 있습니다 ..."); try {thread.sleep (time); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "소녀는 메이크업으로 끝났습니다!, 시간이 걸린 시간" + 시간); }}}} 실행 결과는 다음과 같습니다.
소년과 소녀는 쇼핑을 나가고 소녀는 화장을 시작하고 소년은 기다리고 있습니다. . .
소녀의 메이크업이 끝났습니다! , 5000
소년과 소녀는 쇼핑을 시작했습니다
소년과 소녀는 쇼핑하러 갈거야. 소녀는 먼저 화장을해야합니다. 소녀가 메이크업을 마친 후, 그녀는 함께 쇼핑을 할 것입니다.
그렇다면 Join (Time)의 사용법은 무엇입니까?
공개 클래스 공동 {public static void main (String [] args) {Threadboy Boy = new ThreadBoy (); boy.start (); } 정적 클래스 스레드 보이 스레드 {@override public void run () {System.out.println ( "소년과 소녀가 쇼핑 할 준비가되었습니다"); ThreadGirl girl = new ThreadGirl (); girl.start (); int time = 2000; try {girl.join (시간); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "소년은" + time + "를 기다렸다. }} static class strandgirl은 스레드 {@override public void run () {int time = 5000; System.out.println ( "소녀는 화장을 시작했고 소년이 기다리고 있었다 ..."); try {thread.sleep (time); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "소녀가 만들어졌다!, 시간이 걸렸다" + 시간); }}} 여기서는 결합 메소드가 조인 (시간) 메소드로만 대체됩니다. 설명이 변경되었으며 인쇄 결과는 다음과 같습니다.
소년과 소녀는 쇼핑을 나가고 소녀는 화장을 시작하고 소년은 기다리고 있습니다. . .
소년은 2,000 명을 기다렸고 더 이상 기다리고 싶지 않았습니다. 그는 쇼핑을 갔고 소녀는 화장을 마쳤다! , 5000
소년은 가입 시간을 기다렸다 (시간). 이 시간이 지난 후 소녀가 있던 실이 실행되지 않았다면, 그는 더 이상 기다리지 않고 후속 논리를 계속 실행할 것입니다.
이것으로부터 우리는 결합 방법이 두 스레드의 동기 실행을보다 편리하게 달성하는 것임을 알 수 있습니다. 스레드 1이 실행됩니다. Thread 2를 만나면 Thread 2가 실행될 때까지 기다린 다음 Thread 1의 실행을 계속 실행하십시오. 가입의 의미는 이제 더 시각적입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.