Java新线程使用这个 - 任何原因,如果它是好/坏?

时间:2014-05-03 19:25:21

标签: java multithreading runnable

只需快速查看下面的代码问题,有什么理由不这样做或者没问题吗?

public class MyClass implements Runnable, MyClassInterface {

    Thread threader;

    void start() {
       threader = new Thread(this);
       threader.start();
    }

    @Override
    public void run() {
       Thread current = Thread.getCurrentThread();
       while (threader = current) {
            ..
       }
    }
}

最初的逻辑并不是将它在一个单独的线程中运行的事实暴露给调用者 谁创造了一个" MyClass"但是,如果这是好事还是坏事,那就有疑问。

任何人都可以看到任何有理由不这样做或者是否可以接受。可以预期,MyClass.start()可能会被调用几次。

编辑:更新代码以显示它正在实现Runnable和另一个接口,该接口由客户端代码使用,实际实现可以在单独的线程,相同的线程或任何其他方式运行。我们的想法是将其从客户端抽象出来,因为客户端只是一个对象,而且#34; MyClass"将通知并且不知道(当前)它实现的Runnable接口。

也许不需要抽象,客户应该有更多的控制权?

编辑:start()只是告诉对象它已准备好开始接收通知而不是启动一个线程。

看看这个:http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

1 个答案:

答案 0 :(得分:4)

在我看来,这是一个糟糕的设计,因为你通过实现一个接口(Runnable)和提供一个没有使用该类消费者的公共方法(run)来打破封装。

您可以从 start 方法启动一个帖子,而不必继承 Runnable

public class MyClass {
    private Thread thread;
    public void start() {
       thread = new Thread(this::doWork); // Java 8 method reference
       thread.start();
    }
    private void doWork() {
        // ...
    }
}

如果您无法使用Java 8中的方法引用,请将this::doWork替换为:

new Runnable() { public void run() { doWork(); } }