2016-07-22 73 views
1

我有一個後臺服務,每15秒運行一個線程並執行一些工作。java線程的設計模式

public class CacheCleaner implements Runnable, BackgroundService { 
    .... 

    @Override 
    public void run() { 
     .... 
    } 
} 

BackgroundService是我用系統中的每個後臺服務實現的方法定義的另一個接口。

public interface BackgroundService 
{ 
    String getName(); 
    void start(long initialDelay); 
    ..... 
} 

的問題是,我想要做的每一個這樣的類的run方法的一些工作(3-4行的基本代碼)(也有他們的10-15)。有沒有設計模式或更好的方法可以實現這一點,而不是在15種運行方法的每一種中粘貼4行?

注:我提到了run()方法,因爲我只想在線程處於活動狀態時執行這4行代碼。

+0

使'BackgroundService'實現'Runnable'並定義了'run'嗎? – ChiefTwoPencils

+1

你能提供一個更完整的例子嗎?如果你有一個帶有run方法的抽象類,那麼擴展它,你可以調用'super.run()' –

回答

2

您可以使用繼承......例如,

public abstract class AbstractBaseRunnable implements Runnable { 
    ... 
    @Override 
    public void run() { 
     ... // base work here! 
    } 
} 

public class CacheCleaner extends AbstractBaseRunnable implements BackgroundService { 
    ... 
    @Override 
    public void run() { 
     super.run(); 
     ... // particular work for CacheCleaner here!! 
    } 
} 
+0

啊。這裏有同樣的想法,但我太慢了;-) – TMichelsen

+0

這對我來說非常適合。謝謝! :) –

0

你可以創建包含3-4行的基本代碼和每一個你10-15後臺服務繼承它的抽象類。

public abstract class AbstractBackgroundService implements Runnable,BackgroundService{ 

    @Override 
    public final void run() { 
     prepareRun(); 

     runImpl(); 
    } 

    private void prepareRun() { 
     // your 3-4 lines basic code 
    } 

    protected abstract void runImpl(); 
} 
1

我想你可以做類似的事情。

public abstract class Task implements Runnable { 

@Override 
void run() { 
    //do ur common stuff here (3-4 lines of code that u mentioned) 
    execute(); 
} 
public abstract void execute(); 

} 

您實現了Runnable/Callable,無論你喜歡還是需要。在上面的代碼中,「Task」類實現了Runnable,並且還實現了「run()」方法。在「run()」方法中,你可以做任何你想做的事情,並聲明一個抽象方法「execute()」,這個方法可以由實現類根據需要實現。您的「CacheCleaner」將如下所示:

public class CacheCleaner extends Task implements BackgroundService { 
.... 

@Override 
public void execute() { 
    .... 
} 
}