如何使接口实现runnable?

时间:2017-06-10 05:54:28

标签: java multithreading

我试图创建一个接口,在实现时,方法内的任何内容都将在一个单独的线程上连续执行。

希望这个描述有意义,这就是想法。

接口:

public interface Painting {

void onPaint();
}

主题:

public class Paintable implements Runnable, Painting {

@Override
public void run() {
    onPaint();
}

@Override
public void onPaint() {
}
}

最后,目标是你实现绘画,这需要你实现和覆盖onPaint方法。然后,当执行该线程时,无论您决定放入该方法,都将在Paintable Thread上运行。

public class Main implements Painting {

private static final ScheduledThreadPoolExecutor THREAD_POOL_EXECUTOR = new ScheduledThreadPoolExecutor(3);

public static void main(String[] args) {
    THREAD_POOL_EXECUTOR.scheduleAtFixedRate(new Paintable(), 0, 100, TimeUnit.MILLISECONDS);

@Override
public void onPaint() {
System.out.println("This text should be continously printed, but is not.");
}
}

2 个答案:

答案 0 :(得分:1)

好的,所以你有一个绘图界面,并想把它转换成一个调用onPaint()的Runnable。

你可以这样做:

public class PaintingRunnable implements Runnable {
    private final Painting painting;

    public PaintingRunnable(Painting painting) {
        this.painting = painting;
    }

    @Override
    public void run() {
        this.painting.onPaint();
    }
}

因此,您可以使用

从绘画中制作出Runnable
Runnable runnableThatCallsOnPaint = new PaintingRunnable(somePainting);

但这有点矫枉过正,因为你可以在没有任何使用lambda的类的情况下做同样的事情:

Runnable runnableThatCallsOnPaint = () -> somePaining.onPaint()

您甚至可以使用方法参考:

Runnable runnableThatCallsOnPaint = somePaining::onPaint

答案 1 :(得分:0)

正如上面的回答中所提到的,我同意这一点。你必须创建一个模板类来定义你的步骤,并且在每个步骤中执行什么,你必须由子类或类的委托定义,这将执行精确的逻辑。

主要课程:

 public class Main implements Painting {

        private static final ScheduledThreadPoolExecutor THREAD_POOL_EXECUTOR = new ScheduledThreadPoolExecutor(3);

        public static void main(String[] args) {
            THREAD_POOL_EXECUTOR.scheduleAtFixedRate(new Paintable(new Main()), 0, 100, TimeUnit.MILLISECONDS);

        }

        @Override
        public void onPaint() {
            System.out.println("This text should be continously printed, but is not.");
        }
    }

可上漆的司机班

public class Paintable implements Runnable {

    private final Painting painting;

    public Paintable(Painting painting) {
        this.painting = painting;
    }

    @Override
    public void run() {
        painting.onPaint();
    }

}