【问题标题】:Unable to understand the working of Threads- Runnable Interface无法理解 Threads-Runnable 接口的工作原理
【发布时间】:2011-04-13 04:12:53
【问题描述】:
public class Test {
    private static void funct(final int i) {
        new Thread(new Runnable() {
            public void run() {System.out.println(i);}
         }).start(); 
    }
    public static void main(String[] args) {
        System.out.println(1);
        funct (2);
        System.out.println(3);
        funct (4);
        System.out.println(5);
    }
}

每次运行它时,我都会得到以下解决方案之一。为什么这样? 1 3 5 4 2

1 3 5 2 4

1 3 2 5 4

【问题讨论】:

    标签: java multithreading runnable


    【解决方案1】:

    在此示例中,数字的打印顺序是不确定的。您唯一确定的是 1、3 和 5 将按此顺序出现。但是,在这种安排中,2 和 4 会出现在哪里还不得而知。原因是您有 3 个线程打印出以下数字系列: (1, 3, 5); (2) 和 (4)。这三个线程将由 JVM 调度,但它认为这是最好的。

    多线程编程是一个复杂的话题,因为看起来您才刚刚开始深入研究它,所以我推荐 Oracle 的 Java 教程的并发部分:http://download.oracle.com/javase/tutorial/essential/concurrency/index.html

    【讨论】:

      【解决方案2】:

      这是因为您无法控制首先生成哪个线程。它由 JVM 决定。只有 "1,3,5" 是有序的,因为它们是从 main 执行的。

      这个问题可能是相关的:-

      1. Run java thread at specific times

      【讨论】:

        【解决方案3】:

        因为您的主线程有时会击败其他两个线程。其他时候没有。

        你有三个线程;不能保证哪个会被安排以任何特定的顺序运行。

        【讨论】:

          【解决方案4】:

          线程和异步通常是复杂的主题,但不足之处在于,在您的情况下,线程需要一些时间才能启动,因此它们与其他打印语句交错,具体取决于 JVM 的处理器时间类型(并且反过来,操作系统)决定分配给这些线程。

          如果您想真正了解正在发生的事情,我强烈推荐这本书 Java Concurrency in Practice,作者是 Brian Goetz 和其他人。

          【讨论】:

            猜你喜欢
            • 2014-04-08
            • 2012-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-21
            相关资源
            最近更新 更多