2012-10-10 24 views
4

我正在嘗試編寫一個java程序,它正在讀取數據庫中的信息,併爲該表的每一行創建一個新線程。所以我不知道我需要多少線程。到目前爲止,我有這樣的:根據輸入的數量在while循環中創建多個java線程

 con = DriverManager.getConnection(url, user, passwd); 
     pst = con.prepareStatement("select hostname, ipadress, vncpassword from infoscreens"); 
     rs = pst.executeQuery(); 
     int i=0; 
     while (rs.next()) { 
      i++; 
      Thread tread[i] = new Savescreenshots(rs.getString(1),rs.getString(3),rs.getString(2)); 
      tread[i].start(); 
     } 

但問題是,這個心不是工作。我需要一個可能性爲表中的每一行創建一個新的線程。劑量人有一個想法如何做到這一點

感謝和問候

+0

你應該提供更多的細節,比如:什麼不工作?你也應該考慮使用線程池,你會有很多數據庫條目。 – dan

+0

什麼是不工作。你能指出嗎? –

回答

4

你需要一個動態增長容器的一組未知大小的 - 一個List,例如:

List<Thread> threads = new ArrayList<Thread>(); 
while (rs.next()) { 
    Thread tread = new Savescreenshots(rs.getString(1),rs.getString(3),rs.getString(2)); 
    tread.start(); 
    threads.add(thread); 
} 

在這一點上,所有Thread程序創建並啓動的對象都是threads列表的元素。你可以列舉出來,並做其他你正準備與他們無關(如等待他們完成):

for (Thread thread : threads) { 
    thread.join(); 
} 
+0

不是絕對必要的。 OP可能不需要保持對線程的引用。 –

+0

非常感謝,這解決了我的問題 – treaki

2

你的想法聽起來瘋狂,但你可以做的,是用Java中的SQL的功能,以找出你現在有多少行,然後用這個數字來創建你的線程。

+0

那麼每個線程的構造函數所需要的數據呢?或者你是說先創建一個線程池然後......? –

+0

沒有更進一步,因爲這個想法很可笑。你爲什麼要爲數據庫中的每一行創建一個線程?如果有太多的行要讀取,則會非常快地耗盡內存。 – OmniOwl

+0

什麼?這些是要求。這不是在哪裏說的行數將是巨大的?如果應用程序一次不能提供給N個以上的客戶,該怎麼辦?如果業務需求需要應用程序必須等待幾個線程變得空閒? –

1

嘗試使用只是簡單的變量說t代替數組tread [i]。

另外,如果行數很大,爲每行創建一個新線程可能會填充內存。