线程意外工作



我写了一个简单的Java程序,我希望像

这样的输出
go
hello 
bye //pause for 2 seconds
hello

,但它给出了

之类的输出
go
bye
hello //pause for 2 sec
hello

程序:

class Tread{
      public static void main(String[] args){
           Hello h= new Hello();
           Thread t= new Thread(h);
           System.out.println("go");
           t.start();
           System.out.println("Bye");
      }
}
class Hello implements Runnable{
     public  void run(){
           System.out.println("hello");
           try{
                Thread.sleep(2000);
           }
           catch(Exception e){ }
           System.out.println("hello");
    }
 }

请,有人可以告诉我为什么我没有得到所需的otput?

结果是不可预测的,因为2个线程尝试同时在输出上写入内容。JVM规格未指定操作的顺序:

  • 您有启动另一个线程的主线程
  • 之后,主线程和另一个线程都打印出来。

因此,所有这些都是依赖于实现的:有人可以使用另一个JVM,有一天和/或另一个操作系统,然后他可以采取另一种行为。使用JVM,在您的环境中,您可能会以相同的顺序遇到数百万此程序编写输出的运行。但这并不意味着它将将来永远不会改变。

如果您希望根据特定订单完成操作顺序,则需要使用一些锁或synchronized关键字来访问资源。

认为它总是会始终导致错误,这只是偶尔发生,我们称之为种族条件

我猜是因为它在另一个线程上,独立于主程序。尝试以下操作:

public static void main(String[] args){
        Hello h= new Hello();
        Thread t= new Thread(h);
        System.out.println("go");
        t.start();
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("Bye");
    }
}
class Hello implements Runnable{
    public  void run(){
        System.out.println("hello");
        try{
            Thread.sleep(2000);
        }
        catch(Exception e){}
        System.out.println("hello");
    }
}

最新更新