我写了一个简单的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");
}
}