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)。就像,如果你没有车,你就不能开车。