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

Java线程同步中的wait()和notify()使用简单示例

2015-09-09 10:41 711 查看
一、简介

有时候并发编程中,并不只是保证数据的一致性和操作的原子性,还需要使各个任务按正确的顺序执行。在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();

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