2011-02-11 23 views
7

這是作業。從方法中刪除阻塞

我不想要解決方案,只是少量的鏈接或想法。

簡單地說就是我想要做的是,

簡單的例子:

public class Example 
{ 
    public void method() 
    { 
      int x = doThat(); 
      //Call other methods which do not depend on x 
      return; 
    } 
} 

doThat()是已知的耗時,導致我的程序阻塞,直到結果回來的方法。我想用這個對象的不同方法,但程序是frozen,直到doThat()完成。那些不同的方法不一定必須從本示例中使用的method()中調用,但可能從對象外部調用。

我想過使用線程,但如果我有大量的對象(1000+)這可能不會是非常有效的(糾正我,如果我錯了請)。我猜如果我使用線程,我必須爲每個對象使用一個線程?

除了調用doThat();時可以使調用對象不被阻塞的線程,還有其他方法嗎?如果線程是唯一的方法,你能提供一個鏈接嗎?

知道像這樣的問題得到downvoted我會接受任何downvotes。但請只是一個鏈接將是偉大的。

在此先感謝。我希望問題與規則是一致的。

回答

3

我也會用這個線程,但我只是想補充一點,看看java.util.concurrent.Executors(創建線程池,因爲你有多個對象)以及java.util.concurrent.Futurejava.util.concurrent.Callable類可能會很有趣允許您啓動可返回值的線程。

查看concurrency tutorial瞭解更多信息。

+0

(my)Common表示不可能只讓一個方法成爲線程化的,所以如果我讓類`Example`成爲線程類,當method()被阻塞時,我能夠調用該類的其他方法`doThat()`? – Muggen 2011-02-11 14:15:36

1

我建議您創建一個實現Runnable的類,它的run方法可以完成doThat()在您的示例中所做的操作。然後,您可以通過簡單的方式在單獨的線程中調用它。 Java的Thread class的確有一個構造函數,它具有可運行的特性。使用runjoin方法。

乾杯 馬蒂亞斯

1

當然線程的處理在背景一些工作的唯一解決方案,但 你是不是被迫使用一個線程只爲單個操作執行。 您只能使用一個線程來維護要執行的操作隊列,方法是每次調用該方法時都會向隊列中添加一個新條目。 也許像「策略」這樣的設計模式可以幫助您概括要執行的操作概念,以便將「操作對象」存儲到線程的隊列中。

1

你想同時執行幾件事情,所以使用線程的確是要走的路。 Java tutorial concurrency lesson可能會幫助你。

由於爲每個線程(2 MB?)分配了一定數量的堆棧內存,因此1000個併發線程將施加沉重的內存負載。但是,如果您可以以某種方式確保一次只能運行一個線程,則仍然可以採用每個對象的線程方法。這將需要你管理doThat()僅被調用,如果以前調用另一個對象產生的線程已經完成。

如果你不能確保那麼容易,另一種方法是構造一個工作線程,該工作線程從double ended queue中讀取要處理的對象。然後,doThat()方法會將this添加到隊列的末尾,工作線程稍後會從該隊列中提取它。從併發線程訪問任何數據結構時必須正確同步。主線程應該以某種方式通知工作線程條件,它不會將更多對象添加到隊列中,因此工作線程可以乾淨地終止。