Java 线程意外工作

Java 线程意外工作,java,multithreading,Java,Multithreading,我已经写了一个简单的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);

我已经写了一个简单的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吗?

由于两个线程试图同时在输出上写入内容,因此结果是不可预测的。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");
    }
}

但是我运行了20-30次程序,但是输出是相同的,即使它应该在byeYes之前打印hello,这取决于实现:有人可能使用另一个JVM和/或另一个操作系统,然后他会有另一种行为。使用JVM,在您的环境中,您可能会遇到数以百万计的程序以相同的顺序编写输出。但这并不意味着在另一个环境中,它将是相同的。那么我应该如何使用synchronized here在bye之前显示hello?如果您希望仅在第二个线程终止时打印bye,只需在打印bye之前添加
t.join()
。这是一种等待线程终止的方法。