【问题标题】:in this program why is Thread[Two, 5, main] appearing before One: 5?在这个程序中,为什么 Thread[Two, 5, main] 出现在 One: 5 之前?
【发布时间】:2011-06-14 08:53:34
【问题描述】:
package javaapplication18;
class Alistair_Therein implements Runnable{
String name
     Thread t;
     Alistair_Therein(String threadname){
         name = threadname;
         t = new Thread(this, name);
         System.out.println("New thread:" + t);
         t.start();
     }
     public void run(){
         try{
             for(int i=5; i>0; i--){
                 System.out.println(name " : " + i);
                 Thread.sleep(1000);
             }
         }catch(InterruptedException e) {
             System.out.println(name + "interrupted");
         }
         System.out.println(name + "exiting");
     }


 }

public class Main {


    public static void main(String[] args) {
        new Alistair_Therein("One");
        new Alistair_Therein("Two");
        new Alistair_Therein("Three");
        try{

                Thread.sleep(10000);
            }
        }catch(InterruptedException e){
            System.out.println("Main Thread interrupted");
        }
        System.out.println("Main thread exiting.");
    }

}

输出:

新线程:线程[One, 5, main] 新线程:线程[Two, 5, main] 新线程:线程[三、五、主] 一:5 二:5 三:5 一:4 二:4 三:4 一:3 二:3 三:3 一:2 二:2 三:2 一:1 二:1 三:1 一出。 两个退出。 三人出境。 主线程退出。

为什么Thread[Two, 5, main] 出现在One: 5 之前?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    除非您使用同步构造,否则无法保证您将看到不同线程中的事件发生的顺序。

    [在这个特定的例子中,我猜想启动线程所涉及的开销远大于启动新对象所涉及的开销,因此新对象的创建“获胜”。]

    【讨论】:

    • 那么不使用同步,睡眠有什么意义呢?作者说是让主线程最后退出?
    • @Abhay:在细粒度级别上,两个线程将“竞相”完成。但是在粗粒度级别上,当然,10 秒的睡眠总是会在 5 次 1 秒的睡眠后结束。但是不要尝试使用sleep 来代替正确的同步。
    • 嗯,好吧听起来合乎逻辑。如果你能找到一些实质性的东西来支持它会很好
    • @Abhay Saini 即使没有显式同步,我们几乎可以完全确定生成三个线程并将每个线程计数为 5 所需的时间将少于睡眠持续时间(我怀疑那 Thread.sleep() 需要一个毫秒参数,所以这将是 10 秒)。
    • 但是有3个5秒的睡眠功能?那不是15岁吗
    【解决方案2】:

    请注意,start()不是意味着新创建线程的Runnable.run() 方法中的代码将在该精确时刻开始。它只是将线程置于可运行状态,并让调度程序决定它何时实际运行。

    很可能所有 3 个Thread 对象的构造将在任何新创建的线程开始执行代码之前一次性运行。

    另请注意,打印到System.out(或System.err)会强制进行同步,这很容易影响测试结果。

    【讨论】:

      【解决方案3】:

      线程被设计为并发和独立运行(这是重点)。独立线程的输出可以按任意顺序出现。

      【讨论】:

      • 赫伯特·希尔特的一本书
      • 他使用睡眠,所以你可以看到交错的输出。如果没有睡眠,第一个线程甚至可以在第二个线程开始之前完成,您可能看不到任何并发运行。
      【解决方案4】:

      这是因为您正在打印线程。“Thread[One, 5, main]” 它被打印,因为这些是线程的详细信息。 这里的“One”是指线程名。 这里的“5”表示线程优先级数。 “ma​​in”代表线程组。 如果你评论这一行

      // System.out.println("新线程:" + t);

      Thread[One, 5, main] 不会出现。

      【讨论】:

        猜你喜欢
        • 2016-08-13
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2011-10-10
        • 1970-01-01
        • 2016-07-29
        • 2019-04-24
        • 2012-08-27
        相关资源
        最近更新 更多