Java 线程意外工作
我已经写了一个简单的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);
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规范没有指定操作的顺序:
- 您拥有启动另一个线程的主线程
- 之后,主线程和另一个线程都打印一些内容
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()
。这是一种等待线程终止的方法。