묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
개발자는 기본기가 중요하다
실무에서 개발좀해보닌깐 느꼇는데 개발자는 기본기가 매우매우매우매우매우중요하다. 갓영한님도 그걸 아시기 떄문에 왜써야하고 어떤문제가있고 그러면 어떻게 해결하고 어떻게 개선하는지를 스텝바이스텝으로 보여주신다. 묻따 기본기룰 챙기고 항상 교차검증을 하는 마인드로 개발을 했으면 좋겟다 -어느 흔한 개발자의 주저리 글-
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
시분할과 스케줄링
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]얼마만큼 실행될지는 운영체제가 결정하는것을 스케줄링인데 그럼 스케줄링이 실행되고나서 시분할이 적용되는 방식인가요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 제보] 11. 동시성 컬렉션.pdf 14페이지
[오타 내용]대상 강의록: 11. 동시성 컬렉션.pdf 대상 페이지: p.14 첫 번째 그림에 대한 설명 중 마지막 부분내용기존: 클라이언트인 test() 입장에서 ... (중략) ... BasicList의 어떤 구현체든지 다 받아들일 수 있다.변경: 클라이언트인 test() 입장에서 ... (중략) ... SimpleList의 어떤 구현체든지 다 받아들일 수 있다.강의 잘 듣고 있습니다!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
문제와 풀이2번 궁금증
영한님 안녕하세요. 문제와 풀이 2번을 풀고 고민하고 강의를 학습해도 약간의 의문점이 생겨서 질문드립니다. Thread t1 = new Thread(new MyTask(), "t1"); Thread t2 = new Thread(new MyTask(), "t2"); Thread t3 = new Thread(new MyTask(), "t3"); t1.start(); t2.start(); t3.start(); // 1초 t1.join(); t2.join(); t3.join(); // 대기현재 위와 같은 코드에서 main 쓰레드가 t1, t2, t3에게 작업을 시킵니다. 그리고 t1의 join을 만나니까 t1이 작업이 완전히 끝날때까지 대기상태에 빠집니다. 그리고 t1이 작업이 완료되면 t2.join()이 실행된다면 결과가 아래와 같이 나와야 하는데 왜 이렇게 안 되는지 의문입니다. ㅠㅠt1: 1t1: 2t1: 3t2: 1t2: 2t2: 3...
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 있습니다
강의 자료 : 8. 생산자 소비자 문제1.pdf43페이지큐가 가득 찾을 때 -> 큐가 가득 찼을 때
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 의심 제보] 강의 6:11 부분
오타 여부가 확실하지는 않지만, 제가 생각했을 때 오타가 아닌가 싶어서 제보합니다.영상 위치: 6분 11초강의록 위치: p.24 - 스레드 종료 규칙오타 의심 내용:원본: 예를 들어, thread.join() 호출 전에 thread의 모든 작업이 완료되어야 하며, ...수정: 예를 들어, thread.join() 리턴 전에 thread의 모든 작업이 완료되어야 하며, ...의견: thread.join()을 호출하면, thread가 모든 작업을 마친 후에 void로 리턴하고 난 뒤에야 thread.join() 다음에 있던 코드들을 수행하는 것이니까 리턴이 적절한 단어 아닌가 싶습니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[코드 공유] yield() 유무에 따른 체크 로직 수행 횟수를 확인할 수 있는 코드 공유합니다.
[비교 결론](맥북 프로 2018형 기준)yield() 사용 X: 체크 로직 319_216_379회 수행yield() 사용 O: 체크 로직 000_730_447회 수행[코드 사용법]체크로직 while loop에 있는 Thread.yield();를 주석처리 on/off 하면서 체크하시면 됩니다.프로그램 수행 -> a, b, c, d, e, q를 순서대로 입력위 두 동작을 주석처리 on/off한 후에 실행하는 두 경우 모두에서 비슷한 속도로 해 주시면 비교가 더 명확합니다. [코드 설명]MyPrinterV4 코드를 기준으로 하여 다음과 같이 체크 로직의 수행 횟수를 카운트할 수 있도록 개선했습니다. 러프하게 작성한 코드라서 세부적인 부분은 무시바랍니다.// 체크 로직의 수행 횟수를 기록하는 변수 private static int count = 0;while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { count++; // 체크 로직 수행시 1회 추가 기록 Thread.yield(); // 여기를 On/Off하며 체크 continue; } }// 메인 함수의 마지막 부분에 추가한 코드 // q를 입력하여 프로그램을 종료했을 때까지 수행된 체크 로직의 횟수를 출력 System.out.println(count);[전체 코드]package thread.control.printer; import java.util.Queue; import java.util.Scanner; import java.util.concurrent.ConcurrentLinkedQueue; import static util.MyLogger.log; public class MyPrinterV4 { // 추가된 코드 private static int count = 0; public static void main(String[] args) { Printer printer = new Printer(); Thread printerThread = new Thread(printer, "printer"); printerThread.start(); Scanner userInput = new Scanner(System.in); while (true) { log("프린터할 문서를 입력하세요. 종료 (q): "); String input = userInput.nextLine(); if (input.equals("q")) { printerThread.interrupt(); break; } printer.addJob(input); } // 추가된 코드 System.out.println(count); } static class Printer implements Runnable { Queue<String> jobQueue = new ConcurrentLinkedQueue<>(); @Override public void run() { while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { // 코드 추가된 부분(시작) count++; Thread.yield(); // 주석 on/off 하며 비교 // 코드 추가된 부분(종료) continue; } try { String job = jobQueue.poll(); log("출력 시작: " + job + ", 대기 문서: " + jobQueue); Thread.sleep(3000); log("출력 완료: " + job); } catch (InterruptedException e) { log("인터럽트 발생. message=" + e.getMessage()); break; } } log("프린터 종료"); } public void addJob(String input) { jobQueue.offer(input); } } }
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
run() 메서드가 종료되면 Thread-0을 회수하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래 사진과 같은 상황에서 Thread-0이 run() 메서드 수행을 완료하면, Thread-0은 할 일이 아무 것도 없는 상태입니다.그렇게 되면 Thread-0에게 할당해 준 스택 영역 전체를 JVM이(?) 회수하나요?아니면, 개발자가 따로 명시적으로 Thread-0의 회수?종료?를 명령할 때까지 이를 유지하나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Join 실습 질문
public class JoinMainV3 { public static void main(String[] args) throws InterruptedException { log("Start"); SumTask task1 = new SumTask(1, 50); SumTask task2 = new SumTask(51, 100); Thread thread1 = new Thread(task1, "thread-1"); Thread thread2 = new Thread(task2, "thread-2"); thread1.start(); thread2.start(); // 스레드가 종료될 때 까지 대기 log("join() - main 스레드 대기 시작"); thread1.join(); thread2.join(); log("main 스레드 대기 완료"); log("task1.result = " + task1.result); log("task2.result = " + task2.result); int sumAll = task1.result + task2.result; log("task1 + task2 = "+ sumAll); log("End"); } static class SumTask implements Runnable { int startValue; int endValue; int result = 0; public SumTask(int startValue, int endValue) { this.startValue = startValue; this.endValue = endValue; } @Override public void run() { log("작업 시작"); sleep(2000); int sum = 0; for (int i = startValue; i <= endValue; i++) { sum += i; } result = sum; log("작업 완료 result = " + result); } } }안녕하세요.위 코드는 강의실습에 사용된 코드입니다.개인적으로 thread1.join(), thread2.join() 에 대해 main쓰레드가 WAITING 상태인지를 확인하고 싶어아래와 같이 코드 중간 중간에 상태를 체크해봤습니다. log("main 쓰레드 상태: " + Thread.currentThread().getState()); thread1.join(); log("main 쓰레드 상태: " + Thread.currentThread().getState()); thread2.join(); log("main 쓰레드 상태: " + Thread.currentThread().getState()); 결과는 모두 RUNNABLE로 나타나는데요.sleep시간을 늘려봐도 여전히 RUNNABLE상태가 나옵니다.코드의 어떤 부분을 수정해야지 WAITING상태를 확인할 수 있는지 궁금합니다~!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
우아한 종료 - 코드 질문이요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증 및 저의 생각이 맞는지 확인하려고 질문을 드립니다.우아한 종료 즉 영한님이 만든 ExecutorShutdownMain 클래스에서 shutdownNow를 하고 나면 코드 메시지에, 영한님 이 만들어 났던 sleep() 에서 런타임 메시지 및 인터럽트 발생을 확인할 수 있었습니다.근데 저가 sumbit()으로 하면 어떻게 될까 궁금해서 해보았는데.. 아래와 같이sleep() 메서드 안에 적은 '인터럽트 발생, sleep interrupted' 만 뜨지 런타입 예외가 발동하지 않을 것을, 확인을 할 수 있었습니다.그래서 생각해보니 submit() 메서드는 값을 future로 받아서 런타입 예외 발동하지 않는다? 런타입 예외는 실행 중에 받는 예외인데, 이미 future로 값을 받았기 때문이라는 생각이 듭니다.이것을 보고 이렇게 생각하였습니다.아니면 다른 이유가 있는 것인가요?저의 생각이 틀렷다면sumbit()으로 런러블이나 콜라볼로 값을 받았을 때 runtime 예외가 발생하지 않은 이유가 궁금합니다.답변 부탁드립니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
signal을 받은 스레드의 대기큐에서 우선순위
안녕하세요 영한님. 스레드의 대기 강의에서 질문이 있습니다. BoundedQueueV5를 사용하여 [소비자 먼저 실행] 때 질문입니다. 제가 이해한 것을 쭉 요약해볼테니 어디에서 틀렸는지, 왜 아닌지 답변을 부탁드립니다. ReentrantLock을 사용하게 되면 대기 큐와 producerCond, consumerCond가 있습니다. 소비자1,2,3은 현재 consumerCond에 있는 상황이고 이제 [생산자 시작]으로 넘어가게 됩니다. 생산자1이 락을 획득하였다고 가정하겠습니다. 그럼 생산자1이 락을 획득하여 생산을 시작하겠고, 생산자2와 3은 대기 큐에 등록되어 WAITING 상태로 락을 기다리고 있다고 생각했습니다. 생산자1이 생산을 하고 consumerCond.signal();을 호출하여 consumerCond에 있는 소비자1,2,3 중 하나를 깨웁니다. (소비자 1을 깨웠다고 가정)소비자1은 consumerCond에서 대기 큐로 이동하여 락을 받을 준비를 합니다. 생산자1이 종료되면서 락을 넘겨줍니다.이때 락을 받기 위해 대기중인 스레드가 소비자1, 생산자2, 생산자3이 있는데 왜 항상 소비자1이 우선적으로 락을 획득할까요? signal()을 통해 깨어난 스레드는 락을 우선적으로 획득할 수 있는 무언가가 주어지는건가요?? 답변을 기다리겠습니다. 감사합니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
생산자 소비자 대기 공간 분리 예제5 분석 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예.2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예.3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예.[질문 내용] 안녕하세요 영한님. 자바 고급편1 생산자 소비자 대기 공간 분리 - 예제5 분석 강의를 듣고 질문이 있어서 질문 올립니다. 소비자 먼저 시작 상황에서 질문이 있습니다.소비자 1,2,3이 대기상태에 들어가면서 consumerCond.await() 에서 대기를 하고 있습니다. 그 다음으로 생산자1이 락을 받고 실행이 되지요? 생산자가 생산을 하고 consumerCond에 signal을 주게 됩니다. consumerCond.await()에서 대기하고 있던 소비자를 깨우게 되겠죠. 그럼 대기하고 있던 소비자 중 하나가(소비자1)이 와서 락을 받고 소비를 한 뒤에 producerCond에 signal을 보냅니다. 여기서 제가 궁금한게 나옵니다. 대기상태에 있던 소비자1이 깨어나서 소비를 하고 producerCond에 signal을 줄때 producerCond에 대기중인 생산자가 하나도 없지 않습니까? 그럼 이때 생산자가 락을 받는다는 100%의 보장이 어떻게 이루어지는지 그게 궁금합니다. 질문을 요약해서 적겠습니다. 대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 어떻게 생산자가 그 락을 받는다는 100%의 보장을 할 수 있는지?대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 이럴때 소비자가 보낸 producerCond.signal(); 은 어떻게 처리가 되는지?감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바 병렬 처리
안녕하세요 영한님 ^^ 1기 인프콘때 뵈고, 오랜만에 강의를 보게되어서 반갑습니다 ㅎㅎ 다름이 아니라, 주문 체결 시스템을 개발하여서 병렬 처리 관련해서 공부 및 개발중인데 혹시 아래 링크책을 예전에 공부하신적 있으신가요? https://product.kyobobook.co.kr/detail/S000007668255아니면 다른 책 추천해주실만한게 있으실까요 ? ㅎㅎ아니면 이 강의 다보면 제가원하는 주문 체결 시스템을 만들기위한 기본 베이스는 이해가 될 수 있을까요?설날 잘보내시고 새해 복 많이받으세요 !
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ExecutorServic 우아한 종료 isTerminated()에 대해서 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 올립니다.복습을 하던중에이쪽 부분에서 isTerminated() 부분을 호출하면 셧다운 상태를 확인할 수 있다고 해서, 당연히 true가 나올줄 알고 검증을 해보기 위해서 해보았습니다.근데 왠걸? 저와의 예상과는 다르게 false가 나옵니다..뭐가 문제 있는가 생각해봐서 여러 군데에 isTerminated()를 붙여놓고 해봤는데 true가 나옵니다.볼록 된 부분 입니다.근데 왜? 이렇게 되는지 아무리 생각해봐도 이유를 모르겠습니다.혹시 이렇게 되는 이유를 가르쳐 줄 수 있으신가요? 수정1submit로 뭐 좀 해보는게 있었는데 이것을 execute로 안바꾸고 실행해서 사진 수정함 + 인프런 ai가 답변해준 isShutDown()이 궁금해서 추가 된게 있음(이건 블락? 처리) 수정2사진1개 더 추가. 여러 번 돌려보니 에러메시지가 중간에 떠서 다시 올림. 모르겟다.. 답변 부탁 드립니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
단일 쓰레드에서 성능 차이가 발생하는 이유
성능 테스트를 할 때 멀티쓰레드를 사용하는 것이 아닌 단일 쓰레드(main 쓰레드)만 사용하고 있는데, increment()에 synchronized를 붙인 것과 안 붙인 것의 성능 차이는 왜 발생하는 것인가요? BasicInteger와 VolatileInteger의 경우에는 캐시를 사용하는가, 메인 메모리를 사용하는가의 차이로 성능 문제가 발생했다는 것은 알겠는데, BasicInteger와 SyncInteger 간의 성능 차이가 왜 발생하는 것인지 모르겠습니다..
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Callble 활용 질문 이요.(코드 이런식으로 만들어도 되는지?)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 어찌저찌 하다가 콜라볼를 이용해서 만들기는 하였는데 이렇게 코드로 만들어도 되는지 궁금해서 질문을 드립니다.콜라볼에 Lsit값을 넣어서 , 심플한 callable 리스트를 만들었는데 이렇게 활용해도 되는지 알고 싶어서 코드를 올립니다. 이렇게 만들어도 되냐요? 답변 부탁드립니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
count에 volatile을 붙이는 이유
문제가 되는 부분은 main 쓰레드와 work 쓰레드에서 flag 변경/확인 타이밍이 맞지 않아서인데 왜 count에도 volatile 키워드를 붙여주는 것인가요? flag에만 volatile을 붙인 경우에도 정상 동작하긴 합니다..
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Future Vs. CompletableFuture
[질문 내용]강의 너무 잘 듣고있습니다. 요즘 실무에서는 Future 말고 CompletableFuture를 많이 쓰는걸로 아는데 이에 대한 강의는 없으신가요? 그리고 CompletableFuture 사용에 대한 의견도 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[12:42] 구두 설명과 pdf 설명이 다른 부분의 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.[12:42]에서 "main 스레드는 TIMED_WATING 상태에서 RUNNABLE 상태로..." 설명과 함께 마우스 포인터로 가리키신 pdf 에서는 work 스레드 라고 표기되어 있습니다. 설명에 혼란이 있어서 제가 인터럽트 호출 부분을 다음과 같이 이해한 게 맞는지 확인 부탁드립니다..!0. work 스레드 동작main() 스레드 안에서 thread.start(); 호출(work 스레드 호출)한다.1. main() 스레드 동작Thread.sleep(4000)을 호출하여 TIMED_WAITING 상태로 들어간다. (4초 대기)2. thread.interrupt() 호출4초 뒤 main() 스레드가 깨어나고(RUNNABLE 상태), 바로 아래 코드인 thread.interrupt() 호출한다. -> 이때 work 스레드는 Thread.sleep(3000)으로 인해 TIMED_WAITING 상태였는데, main() 스레드의 인터럽트 신호로 인해 InterruptException이 발생하여 RUNNABLE 상태로 즉시 변경된다.3. InterruptException 처리work 스레드는 catch 블록에서 InterruptException 예외 처리 수행한다. 인터럽트 호출했다고 InterruptException 예외가 반드시 나는 것은 아니다. 설명에서 InterruptException 예외 발생한 이유는 main() 스레드에서 4초 대기 후 work() 스레드 인터럽트 호출할 때, work 스레드 상태가 TIMED_WAITING 였기 때문이다. work 스레드는 인터럽트 호출로 인해 TIMED_WAITING -> RUNNABLE 상태로 즉시 변경되고, work 스레드의 인터럽트 상태는 초기화 되어 false를 반환한 것이다.이렇게 이해하면 될까요..?!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
큐가 비어있는 상황에서 큐에 새로운 작업이 들어왔을 때, 기본 스레드와 초과 스레드 중 어느 스레드 부터 작업을 실행하는지 궁금합니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요."초과 스레드가 작업을 처리할 때 마다 시간은 계속 초기화된다" 7:36초에 말씀을 해주셨는데, 한가지 궁금한 점이 생겨 질문 드립니다! 큐가 가득 차서 초과 스레드가 이미 만들어 졌다고 가정한 상황입니다. 이후에 작업이 없어서 큐가 비어있다고 가정을 하겠습니다.즉, 상황은 큐가 비어있고, 스레드 풀에 기본 스레드 2개, 초과 스레드 2개가 있습니다. 이 때, Executors 에 새로운 작업이 들어오면 이 작업은 무조건 기본 스레드가 초과 스레드 보다 먼저 작업을 수행하게 되나요?만약, 기본 스레드가 먼저 작업을 무조건 수행하게 된다면 이는 BlockingQueue의 내부 구현인 ReentrantLock 과 Condition 으로 인해 WAITING인 기본 스레드 부터 깨우게 되는 것인가요?