2016-07-22 12 views
1

Ich habe einen Hintergrunddienst, der alle 15 Sekunden einen Thread ausführt und einige Arbeit ausführt.Entwurfsmuster für Java-Threading

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

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

BackgroundService ist eine weitere Schnittstelle, die ich mit Methoden definiert haben, die ich jeden Hintergrunddienst im System implementieren möchten.

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

Das Problem ist, dass ich einige Arbeit (3-4 Zeilen von Basiscode) in der run-Methode jeder solchen Klasse machen wollen (es gibt 10 bis 15 von ihnen). Gibt es ein Entwurfsmuster oder einen besseren Weg, um dies zu erreichen, anstatt das Einfügen der 4 Zeilen in jede der 15 Ausführungsmethoden zu kopieren?

HINWEIS: Ich erwähne die run() - Methode, da ich nur diese 4 Zeilen Code ausgeführt werden soll, wenn der Thread aktiv ist.

+0

Machen 'BackgroundService' implementieren' Runnable' mit 'run' definiert? – ChiefTwoPencils

+1

Können Sie ein vollständigeres Beispiel für das liefern, was Sie wollen? Wenn Sie eine abstrakte Klasse mit einer run-Methode haben, dann erweitern Sie das, können Sie 'super.run()' –

Antwort

2

können Sie Vererbung ... zum Beispiel

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

ah aufrufen. Die gleiche Idee hier, aber ich war zu langsam ;-) – TMichelsen

+0

Das funktioniert perfekt für mich. Vielen Dank! :) –

0

Sie könnten eine abstrakte Klasse machen Ihre 3-4 Zeilen von Basiscodes und jedes von Ihnen 10-15 Hintergrunddienste enthält Subklassen es.

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

Ich denke, dass Sie etwas Ähnliches tun können.

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(); 

} 

Sie implementieren die Runable/Callable je nachdem, was Sie wollen/brauchen. Im obigen Code implementiert die "Task" -Klasse das Runnable und implementiert auch die Methode "run()". Hier können Sie in der "run()" - Methode alles tun, was Sie tun möchten, und eine abstrakte Methode "execute()" deklarieren, die von den Implementierungsklassen je nach Bedarf implementiert werden kann. Ihr "CacheCleaner" wird wie folgt aussehen:

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

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