请解析一下这个关于线程的程序

时间:2022-05-09 17:36:02
public class TwoThreads {
static Thread laurel, hardy;

public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};

hardy = new Thread() {
public void run() {
synchronized (laurel) {
System.out.println("D");
try {
laurel.wait();
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
}
};
laurel.start();
hardy.start();
}
}

1.这个程序的运行顺序是怎么样的?
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?

7 个解决方案

#1


1、执行顺序:laurel和hardy,这2个线程交替获得CPU的时间片,交替执行,具体分得的时间片可能不等

#2


1、laurel.wait();是让它自己等等,让出一部分CPU时间给别人,高风亮节的一个线程。

#3


能具体点吗?

#4


求助。。。

#5


1.这个程序的运行顺序是怎么样的?
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象

#6


引用楼主 myj870517 的帖子:
1.这个程序的运行顺序是怎么样的? 
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?

答:
1.可能是:laurel先执行,也可能是hardy先执行.不妨我们再详细分析一下:
情况1:若是laurel先执行,则执行结果是:laurel打印出'A'后sleep(),让出CPU,hardy开始执行,hardy打印出'D'后调用laurel.wait(),使得自己(指:hardy线程)被放入到laurel线程对象的wait等待队列中, 此时laurel线程一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
A
D

F
情况2:若是hardy先执行,则打印出'D'后,被放入到laurel线程对象的wait等待队列中.此时laurel线程 一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
D
A
C
F

2.laurel.wait();是通知另一个线程阻塞吗?是 线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的.

#7


laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的. 
好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。

#1


1、执行顺序:laurel和hardy,这2个线程交替获得CPU的时间片,交替执行,具体分得的时间片可能不等

#2


1、laurel.wait();是让它自己等等,让出一部分CPU时间给别人,高风亮节的一个线程。

#3


能具体点吗?

#4


求助。。。

#5


1.这个程序的运行顺序是怎么样的?
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象

#6


引用楼主 myj870517 的帖子:
1.这个程序的运行顺序是怎么样的? 
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?

答:
1.可能是:laurel先执行,也可能是hardy先执行.不妨我们再详细分析一下:
情况1:若是laurel先执行,则执行结果是:laurel打印出'A'后sleep(),让出CPU,hardy开始执行,hardy打印出'D'后调用laurel.wait(),使得自己(指:hardy线程)被放入到laurel线程对象的wait等待队列中, 此时laurel线程一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
A
D

F
情况2:若是hardy先执行,则打印出'D'后,被放入到laurel线程对象的wait等待队列中.此时laurel线程 一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
D
A
C
F

2.laurel.wait();是通知另一个线程阻塞吗?是 线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的.

#7


laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的. 
好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。