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是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
#6
答:
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
C
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等待,太感谢了。
好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。
#1
1、执行顺序:laurel和hardy,这2个线程交替获得CPU的时间片,交替执行,具体分得的时间片可能不等
#2
1、laurel.wait();是让它自己等等,让出一部分CPU时间给别人,高风亮节的一个线程。
#3
能具体点吗?
#4
求助。。。
#5
1.这个程序的运行顺序是怎么样的?
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
#6
答:
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
C
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等待,太感谢了。
好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。