Java 混乱的多线程示例

Java 混乱的多线程示例,java,multithreading,Java,Multithreading,此代码示例来自教程点多线程教程。类ThreadDemo中定义的start()方法真的有必要吗?如果代码被删除,代码会更干净吗?还是有什么我不明白的地方? 当我们通过实现Runnable接口执行多线程时,需要显式地创建Thread类的对象。在实现可运行接口的情况下,我们必须创建线程对象。话虽如此,由于ThreadDemo类已经扩展了Thread,我们需要在start方法中进行扩展,而我们必须在实现Runnable时进行扩展。我之所以回答这个问题,是因为我觉得我们都需要解释一下示例中的错误所在(这不

此代码示例来自教程点多线程教程。类ThreadDemo中定义的start()方法真的有必要吗?如果代码被删除,代码会更干净吗?还是有什么我不明白的地方?


当我们通过实现Runnable接口执行多线程时,需要显式地创建Thread类的对象。在实现可运行接口的情况下,我们必须创建线程对象。话虽如此,由于ThreadDemo类已经扩展了Thread,我们需要在start方法中进行扩展,而我们必须在实现Runnable时进行扩展。

我之所以回答这个问题,是因为我觉得我们都需要解释一下示例中的错误所在(这不仅显示了多线程的一个坏例子,还暴露了对面向对象编程的理解不足)我们需要让您回到正确的学习道路上。我的回答当然会与您得到的其他评论相呼应

第一件非常非常错误的事情是: ThreadDemo实例是一个线程实例(请记住ThreadDemo扩展了Thread)。如果在其中嵌入Thread对象,则会生成两个不同的线程实例。这是:

  • 浪费(不需要两个实例,只需要一个线程实例
  • 令人困惑(哪个实例真正“重要”?哪个实例正在运行?)
  • 由于副作用,将以错误结束。实际上,调用包装线程演示实例上的
    start()
    stop()
    或任何操作都可能不会以正确的方式影响包装线程实例对象(如果有的话)
多线程有时会让人迷失方向,你不需要任何这些干扰你的大脑

去掉那个 …整个示例可能会被拒绝,因为只有3行代码值多少钱,而且它们与多线程进程无关


以下是了解这一点的途径:
  • 阻止从浏览器中找到此代码的网站,因为它是邪恶的,你会被它污染
  • 请仔细阅读和之间的区别,因为源代码作者未能理解它。基本上,您的类只需要在这里运行即可
  • 使用官方软件,它们真的很好。现在还不必阅读关于同步的东西,因为现在你的代码是
  • 一旦你做到了这一点,就使用everwhere,而不是实例化
    线程
    s和
    启动它们
  • 当您对以上所有内容充满信心时,让您的线程在一个更复杂的
    run()
    方法上协同工作-您需要这样做
  • 拉扯你的头发
  • 回到S:O寻求建议:D

  • 这是一个可怕的代码。我建议你找到另一个可以学习的资源。你是正确的:
    start
    方法(应该标记为
    @Override
    )在这里,除了这两个成员变量之外,没有任何作用:
    线程
    不需要
    线程
    ,它已经允许您设置名称。您不应该过度控制线程的
    run()
    ,并且绝对不应该重写
    start()
    如果您知道自己在做什么。在这种情况下,您可以将
    扩展线程
    替换为
    实现可运行的
    类的一个可怕之处是它既扩展了
    线程
    ,又有一个
    线程
    作为字段。我们怎么能不混淆哪个线程是哪个线程?尤其是such是这个领域的一个没有信息的名字。现在放弃这个教程。阅读Oracle的教程。你会知道它不是由一个对自己的技能有错觉的人写的。
    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();
       }   
    }
    
    class ThreadDemo extends Thread {
       private Thread t;
       [...Stuff...]
    }