2014-02-19 27 views
5

在線程中啓動線程是否是一種好的做法?我已經四處搜尋,但沒有找到太多的信息。在線程內創建線程 - 良好的做​​法?

我有一個TimerTask,它可以在特定的時間每天獲取用戶列表。然後我想獲得一些關於用戶的數據,但這需要用戶輸入。因爲它需要用戶輸入,所以我不希望我的TimerTask線程在用戶沒有響應的情況下被阻塞。例如,列表中的第一個用戶可能無法在X時間內響應,我不想等待X個時間,直到向第二個用戶請求其數據,等等。所以在我的TimerTask中,我創建並啓動了一個新的Thread來獲取數據。這樣,在Y的時間裏,如果我已經收到一些數據(但不是全部),我仍然可以做其他事情,而不是等待每個人完成。

上述做法是不錯的做法嗎?有沒有更好的解決方案?

這是一些psudeo代碼,可以幫助你理解。

class UserThread extends TimerTask { 

     @Override 
     public void run() { 
      log.debug("Get a list of members!"); 
      List<String> users = userManager.getUsers(); 
      retrieveInitialData(users); 
     } 

     public void retrieveInitialData(List<String> users) { 
      for(String user : users) { 
       new Thread(new GetData(user)).start(); 
      } 
     } 

     addToSuccessList(String user) { 
      synchronized(successList) { 
       successList.add(user); 
      } 
     } 

     addToFailureList(String user) { 
      synchronized(failureList) { 
       failureList.add(user); 
      } 
     } 

     class GetData extends Thread { 

      String userID; 

      public GetData(String user) { 
      this.userID = user; 
      } 

      public void run() { 
      try { 
       dataManager.getData(user); 
       addToSuccessList(user); 
      } catch(Execption e) { 
       addToFailureList(user); 
      } 

     } 
+0

它沒有問題。任何線程都可以啓動一個新線程。 –

+2

http://stackoverflow.com/questions/7224670/threads-within-threads-in-java你看過嗎? –

+0

@BalázsMáriaNémeth謝謝你,我錯過了這個! –

回答

8

更好的方法是使用ThreadPoolScheduledExecutorService。從線程開始線程本身並不壞(畢竟所有的線程都在線程內部運行,所以你需要在某個地方這樣做!),但可能表明你的設計存在缺陷。

+0

謝謝蒂姆,我會給ThreadPool一個閱讀! –

+0

ThreadPoolExecutor解決了與Thread不同的問題。一個ThreadPoolExecutor是一個擁有大量線程的ExecutorService,並使用它們來執行任務。區別在於任務的run()方法通常會做一件事,然後返回。我們賦予裸線程的run()方法通常有一個無限期運行的循環(例如,等待端口上的傳入連接等)。 –

2

在Java中,所有線程都歸進程所有,並且它們從何處開始並不重要。所以你的代碼沒有問題。