您的位置:首页 > 编程语言 > Java开发

java的wait和notify方法浅析

2015-08-26 23:35 633 查看
关于java的wait和notify方法首先总结一下几点:

1 wait和notify是Object类的基本方法,也就是说每个对象都有wait和notify方法,wait和notify方法主要用于线程间同步

2 wait和notify方法必需在同步代码块内调用,否则会抛异常,假如有synchronize(b){},那么b.wait或b.notify必须在大括号内调用,也就是说只有确保已经获取一个对象锁的时候才能去wait或notify

3 wait会使当前线程处于等待状态,和sleep以及suspend不同的是,线程调用wait后,会释放锁,而sleep和suspend不会,锁释放后,其他等待的线程就可以拿到锁并执行。wait方法可以指定等待多长时间。

4 notify用来唤醒在等待的线程,如果有多个线程在等待,则随机唤醒一个

下面用一个简单的例子来演示如何使用wait和notify来同步线程,一个线程从1打印到5,然后进入等待状态,另外一个线程从1打印到5,唤醒等待的线程,等待的线程从5接着打印

public class MyThreadA extends Thread {
@Override
public void run() {
super.run();
int n = 0;
int count = 0;
while (n < 10) {
synchronized (SyncDemo.lock) {
count++;
n++;
System.out.println(Thread.currentThread().getName() + ":" + n);
//让线程执行的时间足够长,保证线程之间会争抢CPU,不然线程很快执行结束了,看不到效果
for (int i = 0; i < 1000000; i++) {

}
if (count == 5) {
try {
SyncDemo.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("被唤醒.");
}
}
}
}

}


public class MyThreadB extends Thread {
@Override
public void run() {
super.run();
int n = 0;
int count = 0;
while (n < 10) {
synchronized (SyncDemo.lock) {
count++;
n++;
System.out.println(Thread.currentThread().getName() + ":" + n);
for (int i = 0; i < 1000000; i++) {

}
if (count == 5) {
SyncDemo.lock.notify();
}
}
}
}

}


public class SyncDemo {
public static Object lock = new Object();

/**
* @param args
*/
public static void main(String[] args) {
MyThreadA t1 = new MyThreadA();
MyThreadB t2 = new MyThreadB();
t1.start();
t2.start();
}

}


运行结果:

Thread-0:1

Thread-0:2

Thread-0:3

Thread-0:4

Thread-0:5

Thread-1:1

Thread-1:2

Thread-1:3

Thread-1:4

Thread-1:5

Thread-1:6

Thread-1:7

Thread-1:8

Thread-1:9

Thread-1:10

被唤醒.

Thread-0:6

Thread-0:7

Thread-0:8

Thread-0:9

Thread-0:10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: