나는 linkedBlockingQueue에 값을 계속 삽입하고이 linkedBlockingQueue를 동시에 가져올 여러 소비자 스레드가 있습니다. 그들이 계속 생각할 수있는 조건은 생산자를위한 깃발이 틀리면 그것이 사실 일 때 취하려고하는 것을 중단 할 때입니다. 그러나 나는 두 번째 스레드가 take() 블록 프로세스에있는 문제를 만났다. 내 프로듀서가 플래그를 true로 설정하기 전에 플래그가 true로 설정되기 때문에 트레드 중 하나가 이미 take() 블로킹 메소드를 실행하는 run() 본문에 이미 들어 있기 때문입니다. linkedBlockingQueue에 추가 된 새로운 요소가 없으므로 프로세스를 영원히 차단할 것입니다. 이 문제를 어떻게 해결할 수 있습니까?linkedBlockingQueue.take()로 인해 블로킹 프로세스에있는 스레드를 다시 시작하는 방법
0
A
답변
2
이 문제를 해결하는 표준 방법은 생성자 스레드가 공유 큐에서 완료 될 때 일부 독성 값 (사용자가 선택하는 특정 값)을 삽입하도록하는 것입니다. numOfThreads와 같은 수의 독 값을 넣어야합니다.
소비자 스레드에서 값을 가져올 때마다 값이 독 값인지 확인합니다. 그렇다면 그냥 돌아올 수 있습니다.
0
take()에서 대기중인 스레드를 인터럽트 할 수 있으므로 take()는 catch 된 InterruptedException을 throw하므로 catch 절로 실행됩니다.
+0
블로킹 프로세스에있는 스레드를 어떻게 중단합니까? – 10e5x
nv가 파일 이름이 될 수있는 독약 값을 생각하도록 도와 주시겠습니까? 어떻게 run() 메서드에서 빠져 나올 수 있습니까? – 10e5x
감사합니다. 나는 영원히 while 회 돌이 동안 루프를 빠져 나간다. 그러나 내 poison 값은 "endOfWorkQueue"dont는 fileName에 대한 고유 한 enuff 값이라고 생각하지 않습니다 ... 여전히 ppl이 파일 이름으로 이것을 입력 할 수 있습니다. – 10e5x
실행을 종료하려면 return을 호출하십시오. 파일 이름을 보려면 http://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names를 확인하십시오. 윈도우에서 파일 이름은 다음을 포함 할 수 없습니다 : \/:? * <> | – javaHunter