java thread wait的用法
大家看下
代码:
/**
* 计算输出其他线程锁计算的数据
*
* @author leizhimin 2008-9-15 13:20:38
*/
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
// 启动计算线程
b.start();
synchronized (b) {
try {
System.out.println("等待对象b完成计算。。。");
// 当前线程A等待
b.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b对象计算的总和是:" + b.total);
}
}
}
/**
* 计算1+2+3 ... +100的和
*
* @author leizhimin 2008-9-15 13:20:49
*/
public class ThreadB extends Thread {
int total;
public void run() {
synchronized (this) {
for (int i = 0; i < 101; i++) {
total += i;
}
// (完成计算了)唤醒在此对象监视器上等待的单个线程,在本例中线程A被唤醒
notify();
}
}
}
大家看下蓝字部分,
这程序执行到篮字部分,表示什么意思哦?我不明白这样的用法
还有红字部分
b.wait()应该是让b线程释放执行权吧,那为什么还执行b线程中的代码哦?
------解决方案--------------------
偶是这么理解的。
synchronized (b) 导致了b上开启了同步锁。也就是说
只要存在 synchronized (b) 就会等待解锁。
也就是说A里的synchronized(b) {} 就是为了防止在执行的时候 B里的synchronized (this) { } 代码段同时执行。
来个时间线。
1. A: synchronized (b) {
(这时候拿到b的锁,其他同步段不能执行,在等待中)
2. try {
System.out.println("等待对象b完成计算。。。");
b.wait();
(这时候A放弃b锁,让B执行)
3. B: synchronized (this) {
for (int i = 0; i < 101; i++) {
total += i;
}
notify();
(唤醒A)
4. A:继续执行。