2012-06-27 85 views
3

我有以下Foo類使用FooProcessor類。所以我想要做的是,在運行cp1實例處理方法的同時,我想運行cp2.process()並行執行任務到另一個任務

public class Foo { 

    public static void main(String [] args){ 

     FooProcessor cp1 = new FooProcessor(); 
     FooProcessor cp2 = new FooProcessor(); 

     cp1.process(); 
     // in parallel process cp2.process(); 
    } 

} 

public class FooProcessor { 
    public void process(){ 
     System.out.println("Processing.."); 
    } 
} 

但是,我希望順序cp1,所以我希望它運行和完成,如果cp2不完成或失敗它是好的。如果它失敗了,我想加入結果。它不返回任何樣本,但我想返回結果。

爲此,應該使用TaskExecutor?或線程?

我只想讓cp2與cp1並行運行。或者如果我添加更多讓我們說cp3,我希望它可以並行運行到cp1。

+0

「我想CP1順序」 - 你的意思是你想CP1和CP2以並行方式運行,但同時停止一旦CP1已經完成了它在做什麼,然後要麼採取從CP2的結果,如果它已經完成過或如果不是呢? – assylias

+0

是的,但我的意思是 – DarthVader

回答

5

的方式,我會實現它,在總結:

  • 通過ExecutorService運行不同的程序,例如ExecutorService executor = Executors.newFixedThreadPool(nThreads);
  • Futures的您在List中的所有任務(由ExecutorService#提交返回)
  • 等待future1.get()完成,其中future1是未來連接到CP1
  • 一次get回報(CP1已完成)cancel所有其他期貨(或shutdownNow執行人服務,如果您不需要執行任何更長)
  • 爲取消過程的工作,你的CP2,CP3等需要實施一箇中斷政策,使他們停止他們正在做的儘快。
+0

這就是我所想的。謝謝 :) – DarthVader

0

當然你也可以使用簡單明瞭的線程
如果你知道你需要更多的方法添加到處理器類,併爲它的一個給定的情況下,保持執行順序 - 假如你第一次運行foo方法,和然後運行方法欄,並且你希望它們異步運行,但是保持執行順序(先foo,然後吧),我會考慮使用Active Object模式。
我推薦也使用這種方法,因爲對於處理器類的用戶它將隱藏實現細節。
另外,考慮提供一個decorator /包裝器,它將爲你的對象提供這種異步能力 - 這樣你就可以控制哪個對象異步運行,哪個不是,並且你不必「污染」你的帶有異步調用所需代碼的處理器類。
在這種情況下會使用的一個例子 -

AsyncProcessor ap = new AsyncProcessor(p1); 
ap.process(); //executed asynchronously 
Proccessor p2 = new Processor(); 
p2.process(); //executed synchronously 



另一個apporach是你提到的,執行使用 - 這可以通過執行一個線程池,推動「執行單元可以實現到它「。
一個執行單元將包含目標對象(cp1,cp2,...)和執行方法(當前僅爲進程)
線程將從隊列中取出一個「執行單元」並運行它們。
實現類似活動對象,但「接口」用戶是不同的,因爲它採用了「TaskExecutor接口」類,以提供其「執行單元」

+0

java是否在'jdk中有'AsyncProcessor'? – DarthVader

0

主題將是一個不錯的選擇的東西像接受新的線程,並開始他們的方法...

0

如果你正在寫自己的獨立應用程序,使用線程可能是前進的最簡單的方法。如果您處於Java EE環境中,則不應創建自己的Thread對象,而應使用其他一些機制(例如發送消息並讓消息監聽器處理您發送的信號)。這是爲了讓Java EE容器控制資源利用率,例如線程池。使用線程的

例子:

Thread t1 = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     executeSomeCodeInP1(); 
    } 
}); 

Thread t2 = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     executeSomeCodeInP2(); 
    } 
}); 

t1.start(); 
t2.start(); 

// if you want to wait for both threads to finish before moving on, 
// "join" the current thread 
t1.join(); 
t2.join(); 
+0

這不是我想要的 – DarthVader

相關問題