java线程的设计模式

时间:2016-07-22 05:26:42

标签: java multithreading design-patterns

我有一个后台服务,每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行代码。

3 个答案:

答案 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();
}