2012-03-02 60 views
0

我有一個充當簡單爬蟲的類,我想在一個servlet中調用這個類。如何從java servlet控制一個類(運行/暫停)

我的想法是從用戶那裏得到一個url,然後url請求將被傳遞給servlet,servelt將url傳遞給該類,並且類將開始爬行。並且我希望我的servlet只創建這個類的一個實例。從爬網程序獲取的數據將直接由類添加到數據庫中。 我想控制類的行爲,如從servlet運行/暫停/停止 (對於這個問題,我想我可以創建一個簡單的xml文件,它將在servlet和類之間共享,如果servlet更改狀態代碼類應對狀態變化)

但我有一些疑慮,如何控制類的行爲,如命令它運行/暫停/停止,因爲我的課程不是多線程我不知道什麼是什麼會在從servlet調用它之後調用類,因爲這個類需要從網絡中讀取,顯然在運行它時會有一些間隙/凍結階段。

如何解決這種情況下的併發問題?或換句話說,我是否會遇到任何併發問題?

關於。

回答

2

它取決於您使用的Servlet容器。一些容器爲每個用戶請求產生一個新的Thread(幾乎總是這是所需的行爲),所以你應該設計併發性。

您可以使Servlet類實現SingleThreadModel,然後在service方法中您可以直接調用爬蟲類代碼,因爲一次只有一個線程會輸入service

這意味着只有一個URL可以在給定時間進行處理,這可能不是你想要的,所以不是說,不實現SingleThreadModel,並對創建init方法一個單執行服務:

ExecutorService ex = Executors.newFixedThreadPool(20); //Only 20 tasks at a given time 

然後,在service方法中使用請求中指定的URL創建一個新的CrawlingTask(Runnable),然後將任務提交給執行程序。

這樣,你也可以關閉它:

ex.shutdown(); 

由於ExecutorService的是線程安全的,您不必排隊任務時不用擔心併發性。

-1

首先,瞭解類別線程之間的區別。一個類只是代碼,一個線程是代碼是執行。你不停止/暫停一個類,你停止或停止正在一個類中執行代碼的線程。

我建議你開始閱讀Java concurrency programming.,因爲你所描述的非常關於多線程和線程同步。