1

所以我对多线程的工作原理有点困惑。例如,如果我创建了一个Thread被调用的子类MySub,这就是它的样子:

public class MySub extends Thread {
   public void run {
      for(int i = 0; i < 5; i++){
         System.out.println(i); 
      }
   }
}

在主要课程中,我这样做:

public static void main(String[] args) {
    Thread m = new MySub();
    Thread m2 = new MySub();
    m.start();
    m2.start();
}

是不是应该调用start()for的方法m,然后直接调用start()for的方法m2,不等m线程结束?这不是多线程的重点吗?

但实际上,它从start()调用中打印 0 到 4 m,然后为start()调用打印 0 到 4 m2。他们没有同时进行,而是按顺序进行,这不是我所期望的。我有点期待 0 到 4 个数字的混乱。

4

1 回答 1

5

这是一个竞争条件@Jake。开始第二个线程之前,您main没有等待第一个线程完成。它正在启动第一个线程,该线程在有机会启动第二个线程之前完成其工作。 main

如果您尝试打印(比方说)1000 个数字或需要更多时间的东西,您会开始看到它们交错。或者您可以Thread.sleep(10)在您的println陈述之间放置一个更具体的说明。

仅供参考:建议让您的课程implement Runnable而不是extends Thread. 然后你会这样做:

Thread m1 = new Thread(new MySub());
m1.start();

此外,ExecutorService建议使用代码而不是直接使用线程。

于 2012-07-26T15:30:58.277 回答