2012-07-02 39 views
1

我正在Java中構建一個多線程項目,我有實體和DAO包來包裝數據庫表並操作它們。我有處理包含Runnables的包。到目前爲止,我已經實現了的Runnable的方法是這樣的:我如何構建一個多線程代碼,以便在java中更好地重用代碼?

Class Thread1 implements Runnable{ 
    Thread t; 
    parameters 
    ... 

    public Thread1(){ 
    t = new Thread(this,"Thread1"); 
    .... 
    t.start(); 
    } 

    public int method1(){ 
    ... 
    return x; 
    } 

    public double method2(){ 
    ... 
    return y; 
    } 

    public void run(){ 
    // some processing using DAO methods 
    .... 
    method1(); 
    ... 
    method2(); 
    ... 
    } 

} 

的代碼以這種方式工作,但我需要使用相同的處理在run()法作爲處理的一部分Thread2類。我構建代碼的方式不允許重用代碼。解決這個問題有什麼更好的結構?

+1

附註:爲什麼你要調用Runnable'Thread1'?爲什麼不'Runnable1'? – assylias

+0

@assylias我正在創建一個線程,這就是爲什麼 – Sami

回答

1

你既可以:

  1. Thread1Thread2延伸相同抽象基類,並移動共享邏輯到母體(繼承)。
  2. 創建一個通用接口,這兩個類都實現幷包含常用方法,然後創建一個單獨的類,實現Runnable,並在那裏實現run()(組合)。

你應該總是喜歡合成而不是繼承,所以第二個選項通常比較好,因爲它也給你在運行時改變行爲的靈活性。

例如: 創建一個共享接口第一

public interface SharedTask { 
    public void method1(); 
    public void method2(); 
} 

讓這兩個類實現: public class Thread1 implements SharedTaskpublic class Thread2 implements SharedTask

public class Worker implements Runnable { 

    public Worker (SharedTask task) { 
     this.task = task; 
     ... 
    } 

    public void run() { 
     task.method1(); 
     task.method2(); 
    } 
} 

其他地方在你的代碼: new Worker().start();

+0

我沒有得到第二個選項..所以這兩個類不會是Runnables?他們將創建單獨的Runnable類的實例?如果是這樣的話,會有什麼會進入'run'方法? – Sami

+0

我已經更新了我的答案。 – Jeshurun

+0

知道了,但這種方式常用的方法將在兩個類中實現兩次(這些常用方法的實現是相同的)。無論如何,爲避免繼承,避免在超類中實現它們。 – Sami

0

創建一個抽象類,它實現Runnable並在其運行方法中使用所需的代碼 - 然後將該類擴展多次,因爲您需要在運行方法中使用相同的功能。

0

之前進入多線程的漂亮的細節:有可能你的所有DAO電話將在一個數據庫連接上運行,因此(幾乎)在1分貝線程。 (特別是如果使用一些ORM框架,但是一個簡單的數據源池會給你帶來相同的效果)你肯定可以擺脫這個問題,但這意味着你必須使用兩階段提交的XA資源來保持ACID兼容。 是一大塊工作,所以除非你準備好這麼做,否則考慮應用服務器端多線程的細微差別是毫無意義的。

1

你幾乎從不想自己創建和啓動線程。只需實現Runnable(或者,如果您願意的話,Callable)。然後將它們提交給一個ExecutorService,它爲它運行多少個線程提供了各種酷選項(並且如果您的需求發生變化,將有一個很好的中心位置來改變它),與CompletionService綁定等。

相關問題