我有一个后台服务,每15秒运行一次线程并做一些工作。
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 :(得分:3)
您可以使用继承...例如,
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!!
}
}
答案 1 :(得分: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。在上面的代码"任务" class实现Runnable并实现" run()"方法。在" run()"方法你可以做任何你想做的常见事情并声明一个抽象方法" execute()"这可以由实现类根据需要实现。你的" CacheCleaner"会是这样的:
public class CacheCleaner extends Task implements BackgroundService {
....
@Override
public void execute() {
....
}
}
答案 2 :(得分: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();
}