令人困惑的多线程示例

时间:2016-10-06 08:34:22

标签: java multithreading

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;

   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }

   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      }catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();

      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}

此代码示例来自教程点多线程教程。 ThreadDemo类中定义的start()方法真的有必要吗?代码是否更清洁,如果删除?或者有什么我不理解的地方?

2 个答案:

答案 0 :(得分:3)

我正在回答这个问题,因为我觉得我们都需要解释 这个例子的错误它不仅显示了错误的例子MultiThreading,它也暴露了对面向对象编程缺乏理解)我们需要让你回到正确的学习路径。我的回答当然会回应你得到的其他评论。

第一个非常非常错误的是:

class ThreadDemo extends Thread {
   private Thread t;
   [...Stuff...]
}

ThreadDemo实例一个Thread实例(记得ThreadDemo扩展了Thread)。如果在其中嵌入Thread对象,则会生成两个不同的Thread实例。这是:

  • 浪费(不需要两个实例,只需要一个Thread实例
  • 令人困惑(哪个实例真正'重要'?正在运行哪个?)
  • 由于副作用而以错误结束。实际上,在包装器ThreadDemo实例上调用start()stop()或任何内容可能不会以正确的方式影响包装的Thread实例对象(如果有的话)。

多线程有时可能会让人迷失方向,你不需要任何这种混乱。

删除

...并且可以拒绝整个示例,因为只有3行值得,而且它们与多线程进程无关。

以下是了解此问题的途径:

  1. 阻止您在浏览器中找到此代码的网站,因为它是邪恶的,您会受到它的污染。
  2. 阅读ThreadRunnable之间的区别,因为来源作者未能掌握它。基本上你的课只需要在这里运行。
  3. 使用官方Oracle tutorials,他们真的很棒。不要费心阅读同步内容,因为现在你的代码是embarrasingly parallel
  4. 一旦得到它,请使用Executor Service永远而不是实例化Threadstart。这是您利用Java强大的内置库的地​​方。
  5. 如果您对以上所有内容充满信心,请使用更复​​杂的run()方法让您的主题协同工作 - 您需要synchronization
  6. 拉你的头发
  7. 回到S:O寻求建议:D

答案 1 :(得分:0)

http://www.tutorialspoint.com/java/java_multithreading.htm

当我们通过实现Runnable接口执行多线程处理时,我们需要显式创建Thread类的对象。在实现Runnable接口的情况下,我们必须创建Thread对象。话虽如此,因为ThreadDemo类已经扩展了Thread,我们需要在start方法中执行它,而我们必须在实现Runnable时完成它。