在Eclipse和Netbeans中运行相同的Java多线程程序,为什么会得到不同的输出结果?

3

我在Eclipse和Netbeans IDE中运行这段多线程代码时得到了不同的输出结果,我不知道为什么会出现这种情况,也不知道背后的逻辑是什么。

每次执行这段代码时,它都会显示不同的输出结果,请帮助我。

以下是代码:

public class MyThread2 extends Thread
{

public void run()

{

`System.out.println("r1");`         ``   
    try    ``
    {    
        Thread.sleep(500);    
    }    
    catch(Exception e)    
    {    

    }    
    System.out.println("r2"); 



}    
public static void main(String args[])    
{    
    MyThread2 t1=new MyThread2();    
    MyThread2 t2=new MyThread2();    
    t1.start();    
    t2.start();    
    System.out.println(t1.isAlive());    
    System.out.println(t2.isAlive());    

}    

}    

在Eclipse中的输出:
r1
r1
true
true
r2
r2
在Netbeans中的输出:
r1
true
true
r1
r2
r2

1
多线程并非确定性的,特别是当存在竞争条件时更是如此。在我看来,这并不令人惊讶,也不是一个问题。 - awksp
在Eclipse中运行程序几次。即使在那里,您也可能看到不同的结果。 - Manish
线程对方法或变量的访问由JVM决定。使用synchronized使单个线程一次访问一个方法。 - AJJ
@manish,是的我看到了,但它是如何发生的,有任何流程顺序还是没有。 - Tilak Raj
2个回答

3

线程由JVM调度。JVM选择运行具有最高优先级的可运行线程。每当创建新的Java线程时,它的优先级与创建它的线程相同。因此,在您的情况下,两个线程具有相同的优先级!因此,JVM使用自己的算法(Round Robin Scheduling)来挑选线程并按顺序选择和执行它们。它没有固定的顺序,并且完全无法预测执行速度!

在同一IDE(即Netbeans或Eclipse)上进行不同的示例运行将为您提供不同的输出。您可以尝试运行两者!它可能会失去顺序,因为这些都是由JVM安排的。


2

线程是由JVM调度的,而且没有特定的顺序。这就是为什么您会在涉及线程的相同代码中看到不同的输出结果。

JVM使用内部操作系统底层线程管理来管理线程,几乎所有可用的操作系统都采用循环调度算法进行线程调度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接