여러 스레드를 시작하고 완료 시점을 안전하게 기다립니다.
Thread는 Runnable 작업을 별도 실행 흐름에서 수행합니다. start는 새 스레드를 시작하고 join은 해당 스레드가 끝날 때까지 현재 흐름을 기다립니다.
예제에서 Thread thread = new Thread(task); thread.start(); thread.join(); 부분부터 찾으세요. 선언 타입, 실제 객체와 반환값을 한 줄씩 따라가면서 컴파일 단계에서 잡히는 문제와 실행 중 생기는 문제를 구분하세요.
실무에서는 작업마다 Thread를 직접 만들기보다 ExecutorService로 수명과 동시 실행 수를 제한합니다. interrupt를 받으면 정리하고 필요하면 상태를 복원합니다.
공유 상태를 여러 스레드가 바꾸면 가시성과 원자성 문제가 생기므로 불변 데이터나 동시성 도구를 사용합니다.
현재 코드를 먼저 실행해 출력과 타입 흐름을 확인한 뒤 세 번째 스레드를 추가하고 세 작업이 끝난 뒤 완료 문구가 출력되게 하세요.
run을 직접 호출하면 새 스레드가 시작되지 않고 현재 스레드에서 동기 실행됩니다.
직접 바꿔보세요세 번째 스레드를 추가하고 세 작업이 끝난 뒤 완료 문구가 출력되게 하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.