Runnable中具有Thread类型的本地字段

时间:2014-07-18 12:30:34

标签: java multithreading runnable

Thread实现的类中使用本地Runnable字段是一种糟糕的设计:

    public class TestingThread implements Runnable {
        Thread t;   

        public TestingThread() {
            t = new Thread(this, "Testing thread");

        }
        public void start()
        {
            t.start();
        }
...

2 个答案:

答案 0 :(得分:2)

虽然这种问题显然是固执己见的,但我会告诉你为什么我认为这是一个设计缺陷。 (实际上,我挑起了这个问题,所以也许我应该回答。)

Runnable是一个包含将在(或应该)在线程中执行的代码的对象。文档以这种方式解释:

  

Runnable接口应该由任何其实例都要由线程执行的类实现。

Runnable接口背后的主要思想是将可执行代码与执行代码分开。在自己的线程中运行此类代码有几种可能性。

其中一种可能性是Thread类。从其文档:

  

有两种方法可以创建新的执行线程。一种是将一个类声明为Thread的子类。该子类应该重写Thread类的run方法。然后可以分配和启动子类的实例。 [...]创建线程的另一种方法是声明一个实现Runnable接口的类。该类然后实现run方法。然后可以分配类的实例,在创建Thread时作为参数传递,然后启动。

在我看来,你总是应该做后者。定义Runnable接口的实现,将它们的实例传递给Thread的构造函数,然后启动该线程。例如:

class MyRunnable implements Runnable { ... }

void runMyCodeInOwnThread() {
    Runnable runnable = new MyRunnable();
    Thread thread = new Thread(runnable);
    thread.start();
}

在线程中执行Runnable的另一种方式是Executor,尽管您很可能会使用ExecutorService(实际上是Executor的子类型)。实用程序类Executors很可能用于检索执行程序服务。例如:

class MyRunnable implements Runnable { ... }

void runMyCodeInOwnThread() {
    Runnable runnable = new MyRunnable();
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<?> future = executor.submit(runnable); // or simply "executor.execut(runnable);"
}

如果你没有通过如何执行它来纠缠你的runnable,你可以随意使用这两种机制,或者在需求提前时将其更改。

然而,当我查看类的文档时,我也在示例中看到了相同的机制。不过,我认为这不是一个好的设计。

答案 1 :(得分:1)

在另一个线程类中保留或使用本地线程变量是首选问题。但据我所知,这不是一个好的设计,直到你有特定的要求这样做并在你的线程类中使用那个本地线程变量。你在现实生活中几乎不需要这种要求。希望它可以帮到你!