线程和可运行的差异

时间:2015-04-04 09:40:56

标签: java multithreading runnable

我遇到过这个问题而我无法找到一个好的答案。

在Java中,我可以通过两种方式创建一个线程:

1.实现Runnable接口

public class RunnableInstance implements Runnable {
    public void run() {
        // functionality goes here
    }
}

创建的新线程如下:

public class Client {
    public static void main(String[] args) {
        RunnableInstance runnableInstance = new RunnableInstance();
        Thread thread1 = new Thread(runnableInstance);
        thread1.start();
    }
}

使用此方法的优点:

  1. Client类可以继承任何其他类。
  2. Client类可以实现任何其他接口。
  3. 以这种方式创建一个线程实际上将作业(RunnableInstance)和跑步者(客户端)分开。
  4. 如果run()中编写的功能不需要作为单独的线程运行,我可以直接使用它而无需创建线程。
  5. 2.扩展Thread类:

    public class ThreadInstance extends Thread {
        ThreadInstance() {
            super("myThread");
        }
        public static void main(String[] args) {
            new ThreadInstance().start();
        }
    }
    

    从使用Runnable的优点可以看出:

    1. 此类不能再继承任何类,因为它已经扩展了Thread。
    2. 它将作业和跑步者混合在一个班级中。 由于这些原因,程序员可能更喜欢使用Runnable。
    3. Thread类本身实现Runnable接口并提供run()的空实现。

      ## Questions ##

      1. 为什么在Thread类中完成,当我们已经有了一种更简洁的方法来定义作业(线程的功能)?
      2. 我找到了一些答案 一个。当我们确定只是异步执行的事情时,我们可以在这种情况下遵循这种方法。

        湾我们可以在RunnableInstance的run()中定义作业,然后通过将Runnable实例附加到线程来异步执行。

        OR

        我们可以通常在需要时调用run()方法来执行run()内的代码。  在这种情况下,如果我知道我必须正常执行一个方法,为什么我要实现Runnable然后在run()中定义我的功能?我可以在任何地方做到。

        在Java中提供这两种创建线程的方法实际上是什么原因?

        人们可能会发现它重复,但我找不到令人信服的答案。为什么有两种方式,当Runnable更干净的方式?如果我不必在线程中使用它,为什么我会在run()中实现Runnable并编写我的代码。除了上面描述的内容之外,实际上让他们提供了这两种方式。

0 个答案:

没有答案