2010-05-31 17 views
1

我有線程如何在java中結束一個線程?

ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool(); 

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

我有,我想創建一個iothread一個簡單的網絡爬蟲的2個游泳池,它傳遞一個URL,那麼它會獲取網址並在通過內容輸出到cpuThread是處理和ioThread然後將獲取另一個網址,等等...

在某些時候IO線程將不會有任何新的頁面進行爬網,我想更新我的數據庫,該會話完成。我怎樣才能最好地分辨線程何時完成處理並且程序可以結束?

回答

2

一個典型的方法是使用通用(易失性或同步)布爾標誌在線程之間進行通信。當IO線程完成時,它翻轉標誌。另一個線程在循環中檢查標誌值,當它看到更改後的值時,它將退出循環並終止。

如果在IO線程和處理線程之間使用帶有工作隊列的生產者 - 消費者模型,則另一種可能性是將特殊的「處理結束」令牌傳遞給隊列,這將向處理器發出信號他們可以終止。

+0

線程如何實際終止? – James 2010-05-31 21:01:36

+4

只需從'run()'方法返回''。 – BalusC 2010-05-31 21:06:14

+0

毫無意義。另一個線程可以在一個循環中用1ms的timout調用join(),根本不需要布爾值。 – EJP 2010-06-02 04:00:56

0

完成奠定了程序邏輯。將URL存儲在Stack對象中(堆棧是線程安全的)。

如果

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

然後程序可以寫入數據庫並退出。

相關問題