使用Java多线程编译逻辑?

Jak*_*man 1 java multithreading

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

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

在主要课程中我这样做:

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

它不应该调用start()方法m,然后直接调用start()方法m2,而不是等待m线程完成?这不是多线程的重点吗?

但实际上,它会从start()呼叫中打印0到4 m,然后从0到4打印start()呼叫m2.他们没有同时进行,他们顺序进行,这不是我的预期.我有点期待一堆乱0到4的数字.

Gra*_*ray 5

这是一场竞争条件@Jake.你main不是等待第一个线程启动第二前完成.它开始第一个完成其工作的线程,然后 main才有机会启动第二个线程.

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

仅供参考:建议您上课implement Runnable而不是extends Thread.然后你会做:

Thread m1 = new Thread(new MySub());
m1.start();
Run Code Online (Sandbox Code Playgroud)

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