2014-04-25 81 views
0

我正在研究爬網程序,它在JAVA中以24x7的方式爬完整個web。Java中的線程問題

爲了提高抓取速度,我在其中實現了線程。但這是我無法理解的。

考慮下面的代碼:

 for(int i=0; i<no_of_threads; i++){ 
       new Thread("" + i){ 
       public void run() 
       { 
        try 
        { 
        System.out.println("Instance: " + getName() + " running"); 
        getSeed(); 
        Thread.sleep(1000); 

        } 
        catch (Exception e) 
        { 
        e.printStackTrace(); 
        System.out.println("Thread could not start: "+getName()); 
        } 
       } 
       }.start(); 
      } 

首先,程序將顯示以下輸出:

Instance: 5 running 
Instance: 6 running Instance: 4 running Instance: 3 running Instance: 2 running Instance: 1 running 
Instance: 7 running Instance: 0 running 
Instance: 8 running 
Instance: 9 running 

在此之後,將其與正常執行,並且程序連續運行一段時間開始。 突然,我得到:

Thread could not start: 6 

和程序連續一段時間。然後,

Thread could not start: 9 

並突然停止所有線程。

只有在線程啓動時處理異常時,纔會給出消息「線程無法啓動」。但是,既然它已經顯示「實例運行」,這意味着線程已經在運行。

我不明白爲什麼以及如何發生。

+0

檢查內存,更改ulimit,但更重要的是,分享getSeed和異常 –

+0

只是一個瘋狂的猜測,但你有沒有嘗試同步'getSeed()'? – deanosaur

+0

睡眠(1000)爲? –

回答

3

您自己的消息「線程無法啓動」不正確。該線程已經啓動,但您在Thread本身內只捕獲了某種Exception。您正在打印異常的堆棧跟蹤,但您沒有將其包括在此處。檢查堆棧跟蹤以確定真正的問題。只是不是線程沒有啓動;線程中還有其他一些問題。

+0

嘿,謝謝你的正確道路。這是我在堆棧跟蹤中得到的結果: java.lang.OutOfMemoryError:Java堆空間將堆轉儲到java_pid1880.hprof ...創建堆轉儲文件[在109.742秒內有2373197265個字節]。 我不知道大量的數據(大約2GB)來自哪裏。我甚至嘗試過: -Xmx2048m -XX:+ HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit – cipherux