Java 如何使接口实现可运行?
我试图创建一个接口,当实现时,该方法中的任何内容都将在单独的线程上持续执行 希望这个描述有意义,以下是想法 接口:Java 如何使接口实现可运行?,java,multithreading,Java,Multithreading,我试图创建一个接口,当实现时,该方法中的任何内容都将在单独的线程上持续执行 希望这个描述有意义,以下是想法 接口: public interface Painting { void onPaint(); } 线程: public class Paintable implements Runnable, Painting { @Override public void run() { onPaint(); } @Override public void onPaint() { }
public interface Painting {
void onPaint();
}
线程:
public class Paintable implements Runnable, Painting {
@Override
public void run() {
onPaint();
}
@Override
public void onPaint() {
}
}
最后,目标是实现绘制,这需要实现并重写onPaint方法。然后,当该线程执行时,您决定在该方法中放入的任何内容都将在可绘制线程上运行
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.");
}
}
好的,您有一个绘画接口,并希望将其转换为调用onPaint()的可运行接口 您可以这样做:
public class PaintingRunnable implements Runnable {
private final Painting painting;
public PaintingRunnable(Painting painting) {
this.painting = painting;
}
@Override
public void run() {
this.painting.onPaint();
}
}
因此,你可以使用
Runnable runnableThatCallsOnPaint = new PaintingRunnable(somePainting);
但这太过分了,因为您可以在不使用lambda的任何类的情况下执行完全相同的操作:
Runnable runnableThatCallsOnPaint = () -> somePaining.onPaint()
您甚至可以只使用方法引用:
Runnable runnableThatCallsOnPaint = somePaining::onPaint
正如上面的回答中提到的,我同意这一点。你必须创建一个模板类来定义你的步骤,在每个步骤上,你必须通过子类或你的类的一个委托来定义你将执行的确切逻辑 主要类别:
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();
}
}
在我看来没问题,错误是什么?您面临的问题是什么?您通过
接口Paintable extenses Runnable使可绘制
可运行
,但这似乎与您的实际问题无关,不管是什么。好吧,您正在将一个新的可绘制文件传递给您的执行者。Paintable有一个默认的onPaint()实现,它完全不做任何事情。如果希望调用主类的onPaint(),那么它应该扩展Paintable,并且应该将newmain()
传递给执行器。但是您确实不需要这个可绘制的类和绘制接口。只需使用lambda:Main Main=newmain();executor.scheduleAtFixedRate(()->main.onPaint(),…)
。不,不需要抽象,但无论如何。如果你的目标是你所说的,那么你不应该使用继承。定义一个实现Runnable的PaintingRunnable类,将绘画作为其构造函数的参数,并让其run()方法调用绘画的onPaint()方法。然后使用scheduleAtFixedRate(new PaintingRunnable(new Main()),…)
。但是,同样,考虑到对另一个对象的方法的可运行的委托可以用lambda在一行代码中实现,这太过分了。我不相信这会对我正在尝试的工作起作用。我希望这个接口易于实现。例如,假设我刚刚创建了一个全新的类。我应该能够做到以下几点,理论上应该是可行的<代码>公共类测试实现绘制{@Override public void onPaint(){System.out.println(“应该运行”);}所以,一旦创建了该类,就需要该类的实例,对吗?所以您创建了一个:testtest=newtest()代码>。您希望使用执行器执行测试的onPaint()方法,对吗?因此,您创建了一个可运行的测试
,并将其传递给执行器:executor.scheduleAtFixedRate(test::onPaint,0,100,TimeUnit.millises)代码>。这就是你所需要的。不确定它为什么不起作用,以及它如何不符合您的需要。你真的试过吗?那是我不想做的。我试图以一种不必创建实例的方式来编写它。是的,我已经测试了你的方法,它确实可以工作,但我正在开发的系统不允许用户创建一个实例,在这个实例中,他们只能实现绘画才能工作。这是不可能的。如果没有定义实例方法的类实例,则不能调用实例方法(onPaint)。就像,如果你没有车,你就不能开车。