如何解释和解释此Java线程程序的执行结果

时间:2019-05-04 15:21:17

标签: java multithreading java-threads

我是线程新手。我从https://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/definition.html

阅读了一篇文章

“线程是程序中的单个顺序控制流。”这对我来说仍然是无形的,如果有人可以举另一个例子并进行更多解释,这将非常有帮助。

然后,我使用以下代码检查一些示例。

class SimpleThread extends Thread {
     public SimpleThread(String str) {
         super(str);
     }
     public void run() {
         for (int i = 0; i < 10; i++) {
             System.out.println(i + " " + getName());
             try {

                 # sleep((int)(Math.random() * 1000));
                 /* I have changed Math.random() to 0.5 so that all will sleep with same amount of time */
                 sleep((int)(0.5 * 1000));
             } catch (InterruptedException e) {}
         }
         System.out.println("DONE! " + getName());
     }
 }

 class ThreeThreadsTest {
     public static void main (String[] args) {
         new SimpleThread("Jamaica").start();
         new SimpleThread("Fiji").start();
         new SimpleThread("Bora Bora").start();
     }
 }

在ThreeThreadsT​​est的主要功能中,三个线程是一个一个地创建的,结果应遵循以下模式:

0牙买加
0斐济
0波拉波拉岛
1牙买加
1斐济
1波拉波拉岛
2牙买加
2斐济
2波拉波拉岛...

但是结果却是这样的:
0牙买加
0波拉波拉岛
0斐济
1牙买加
1波拉波拉岛
1斐济
2牙买加
2斐济
2波拉波拉岛
3牙买加
3斐济
3波拉波拉岛
4波拉波拉岛
4牙买加
4斐济
5波拉波拉岛
5牙买加
5斐济
6波拉波拉岛
6牙买加
6斐济
7波拉波拉岛
7斐济
7牙买加
8波拉波拉岛
8牙买加
8斐济
9波拉波拉岛
9斐济
9牙买加
完成!斐济
完成!波拉波拉岛
完成!牙买加

有人可以解释为什么会发生这种情况吗?

2 个答案:

答案 0 :(得分:3)

Thread.start()将一个线程放入准备执行的线程队列中。然后,操作系统会选择任何就绪线程并执行它。不能保证接下来会选择哪个线程,因此执行的顺序是相当随机的。

答案 1 :(得分:1)

内部的线程具有“顺序流”,但对于多个线程则不是。

“相同的时间”并不像看起来那样固定。 在CPU内,毫秒级的时间就像永恒。 CPU将等待您定义的毫秒数,但是在“等待”之后,取决于CPU,它将首先恢复哪个线程。