2010-05-31 5 views
1

내가 스레드 자바에서 스레드를 종료하는 방법은 무엇입니까?

ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool(); 

cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus); 

나는 내가 iothread을 만들려면 간단한 웹 크롤러가 2 개 풀을 가지고, 그 다음 URL을 가져옵니다, 그것에게 URL을 통과 할 수있는 cpuThread을 통해 내용을 전달합니다 처리되고 ioThread는 다른 URL 등을 가져옵니다.

일부 지점에서 IO 스레드는 크롤링 할 새 페이지가 없으므로이 세션이 완료된 데이터베이스를 업데이트하고 싶습니다. 스레드가 모두 처리가 완료되고 프로그램을 종료 할 수있는시기를 어떻게 알 수 있습니까?

답변

2

일반적인 방법은 공통 (휘발성 또는 동기화 된) 부울 플래그를 사용하여 스레드간에 통신하는 것입니다. IO 스레드가 끝나면 플래그를 넘깁니다. 다른 스레드는 루프에서 플래그 값을 확인하고 변경된 값을 볼 때 루프를 빠져 나와 종료합니다.

IO 스레드와 처리 스레드 사이에 작업 큐가있는 생산자 - 소비자 모델을 사용하는 경우 다른 "프로세스 끝내기"토큰을 큐에 전달하여 프로세서에 신호를 보냅니다. 그들은 끝낼 수 있습니다.

+0

어떻게 실제로 스레드가 종료됩니까? – James

+4

'run()'메소드에서'return' 만합니다. – BalusC

+0

꽤 무의미합니다. 다른 스레드는 루프에서 1ms 타임 아웃을 사용하여 join()을 호출 할 수 있으며, 부울은 필요하지 않습니다. – EJP

0

대한으로 CyclicBarrier를 사용하여 완료하는 모든 스레드를 기다릴 수있는 프로그램 로직을 배치합니다. Stack 객체에 URL을 저장합니다 (스택은 스레드로부터 안전함).

a. there are no more URLs on the stack 
b. no more crawler threads running 
c. no more CPU/processing threads running 

그런 다음 프로그램이 DB 종료에 기록 할 수 있습니다.

관련 문제