一、简介
有时候并发编程中,并不只是保证数据的一致性和操作的原子性,还需要使各个任务按正确的顺序执行。在Java中提供了多种方法来实现同步。这里使用wait()和notify()来实现一个简单的双线程交替工作的同步场景。
wait()是Object的方法,使得当前线程释放该Object的锁,同时可以设置一个等待时间。notify()也是Object的方法,通知某个等待该Object的锁的线程继续执行,如果有多个线程在等待该锁,会随机选择一个唤醒。notifyAll()则会唤醒所有线程。
如果在同步方法里调用上述三个方法,则默认的锁是当前的对象的锁。
二、用代码实现两个线程交替打印aa和bb
package com;
/**
* 本例演示了wait()和notify的简单用法 使用两个线程接替工作,线程1打印aa,线程2打印bb
*
* 模拟了一个简单的线程同步场景
*
*/
public class Main {
String lock = "bfghg";
Boolean flag = false;// 标志,如果是true打印aa,如果是bb打印bb
public static void main(String[] args) throws Exception {
final Main m = new Main();
// 开启线程不停打印aa
new Thread(new Runnable() {
@Override
public void run() {
try {
m.method1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 开启线程不停打印bb
new Thread(new Runnable() {
@Override
public void run() {
try {
m.method2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
// 打印aa
public void method1() throws InterruptedException {
while (true) {
synchronized (lock) {
if (flag) {
lock.wait();
}
System.out.println("aa");
Thread.sleep(1000);
flag = !flag;
lock.notify();
}
}
}
// 打印bb的方法
public void method2() throws InterruptedException {
while (true) {
synchronized (lock) {
if (!flag) {
lock.wait();
}
System.out.println("bb");
Thread.sleep(1000);
flag = !flag;
lock.notify();
}
}
}
}