You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
00:11:59 [ main] Start
00:11:59 [ thread-1] 작업 시작
00:11:59 [ thread-2] 작업 시작
00:11:59 [ main] end
00:12:01 [ thread-2] 작업 완료
00:12:01 [ thread-1] 작업 완료
위 예제에서 thread-1과 thread-2는 각각 2초간의 작업을 수행하고 종료된다.
하지만 메인 스레드는 두 스레드의 작업이 끝나길 기다리지 않고 start() 메서드를 호출한 직후 바로 다음 코드를 실행한다.
따라서 로그에서 보이듯이 main 스레드는 "end"를 먼저 출력하고 종료되며, 이후에 thread-1, thread-2가 자신의 작업을 마친다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
join - 시작
1. 코드
thread-1과thread-2는 각각 2초간의 작업을 수행하고 종료된다.start()메서드를 호출한 직후 바로 다음 코드를 실행한다.thread-1,thread-2가 자신의 작업을 마친다.join-필요한 상황
1. 코드
thread-1과thread-2의 작업을 시작(start())시킨 직후, 두 스레드가 계산을 완료하기도 전에task1.result와task2.result값을 바로 출력한다.task1.result,task2.result,task1 + task2모두 0으로 출력된다.2.this
run()메서드를 호출할 때, 해당 메서드를 포함한 객체의 참조를 스택 프레임의 this 변수에 저장한다.this값을 참조하여 자신이 속한 객체의 멤버를 찾아간다.SumTask인스턴스를this로 참조하며, 이를 통해 해당 인스턴스의result필드에 값을 저장하게 된다.join - sleep() 사용
1. 코드
main스레드에서sleep(3000)메서드를 통하여 3초간 대기한다.join - join() 사용
1. 코드
join()을 이용하여 main스레드가 두 스레드의 종료를 기다리도록 구성되어 있다.join()의 동작이 제대로 수행된 것을 확인할 수 있다.2. join() 호출 시 스레드 변화
1) main 스레드 대기 과정
thread1.join()과thread2.join()이 호출되면 main스레드는 해당 스레드가 종료될 때까지 내부적으로 WAITING 상태로 전환된다.2) Waiting 상태 진입
join()은 내부적으로 모니터 락을 통해 스레드 객체를 기반으로 기다리는 구조를 가진다.3) join() 사용 장점
a. 스레드 간의 결과 수집
join()은 이러한 작업의 완료 시점을 확실하게 보장해 주어, 스레드 간의 동기화를 매우 단순하고 명확하게 구현할 수 있게 한다.b. 스레드 흐름 제어
join()을 이용하는 것이 안전한 선택이다.4) join() 단점
join()은 기본적으로 종료 시점까지 무기한 기다리는 형태로 동작한다.join - 특정 시간 만큼만 대기
1. join()
join()메서드는 호출한 스레드가 대상 스레드의 실행이 끝날 때까지 무기한으로 대기한다.join(ms)메서드는 호출한 스레드가 특정 시간 동안만 대상 스레드를 기다리며, 지정된 시간이 지나면 자동으로 RUNNABLE 상태로 돌아와 이후 코드를 계속 실행한다.1. 코드
thread1.join(1000)으로 메인 스레드는 정확히 1초 동안만 대기한다.task1.result는 아직 계산되지 않았으므로 0으로 출력된다.thread-1은 백그라운드에서 계속 실행되어 계산을 마친 뒤 결과를 로그로 출력한다.2. 스레드 상태
join(ms)를 호출하면 메인 스레드는 일반적인 WAITING 상태가 아니라, 일정 시간 동안만 기다리는 TIMED_WAITING 상태로 전환된다.thread-1의 실제 작업 시간은 2초가 필요하지만, 메인 스레드는 1초만 기다리도록 설정되어 있기 때문에, 메인 스레드는 계산 결과를 기다리지 않고 그대로 다음 코드를 실행한다.All reactions