繁体   English   中英

令人困惑的多线程示例

[英]Confusing multi threading example

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()方法真的必要吗? 如果将其删除,代码是否更干净? 还是这里有些我不理解的东西?

我在做这样的一个答案,因为我觉得我们都需要解释 什么是错的例子它不仅显示出多线程一个坏榜样,但也暴露出缺乏面向对象编程的理解 ),我们需要把您回到正确的学习道路 我的回答当然会回应您收到的其他评论。

第一件非常非常错误的事情是:

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

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

  • 浪费(不需要两个实例,只需要一个线程实例
  • 令人困惑 (哪个实例真正在“计数”?哪个实例在运行?)
  • 由于副作用而以错误告终。 实际上,如果调用包装器ThreadDemo实例上的start()stop()或任何东西,可能根本不会以正确的方式影响被包装的Thread实例对象。

多线程有时会让人迷失方向,您无需费神。

删除那个

...并且整个示例都可以被拒绝,因为几乎没有3行值得,而且它们与多线程处理无关。


这是学习此方法的途径:

  1. 阻止在浏览器中找到此代码的网站,因为它是邪恶的,您会被它污染。
  2. 阅读ThreadRunnable之间的区别,因为源Author未能掌握它。 基本上,您的班级只需要在此处可运行。
  3. 使用Oracle官方教程 ,它们确实很棒。 不必再花时间阅读同步知识了,因为现在您的代码令人尴尬地是parallel
  4. 一旦知道了这一点,就可以在任何地方使用Executor服务,而不是实例化Threadstart它们。 在这里,您可以利用Java强大的内置库。
  5. 当您对以上所有内容都充满信心时,请让您的线程在更复杂的run()方法上一起工作-您将需要同步
  6. 拉你的头发
  7. 回到S:O寻求建议:D

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM