【问题标题】:How to interpret and explain the execution result of this java threading program如何解释和解释这个java线程程序的执行结果
【发布时间】:2019-05-04 15:21:16
【问题描述】:

我是线程新手。看了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 的 main 函数中,三个线程被一个一个地创建,结果应该是这样的:

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 牙买加
完毕!斐济
完毕!波拉波拉岛
完毕!牙买加

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

【问题讨论】:

    标签: java multithreading java-threads


    【解决方案1】:

    Thread.start() 将一个线程放入准备好执行的线程队列中。然后操作系统选择任何准备好的线程并执行它。没有保证下一个线程会被选中,所以执行顺序是相当随机的。

    【讨论】:

      【解决方案2】:

      里面的线程有一个“顺序流”,但对于多个线程来说不是这样。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多