package demo.thread;
/*
等待/唤醒机制。
涉及的方法:
1,wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池(等待集)中。
2,notify():唤醒线程池中一个线程(任意).
3,notifyAll():唤醒线程池中的所有线程。
这些方法都必须定义在同步中。
因为这些方法是用于操作线程状态的方法。
必须要明确到底操作的是哪个锁上的线程。
为什么操作线程的方法wait notify notifyAll定义在了Object类中?
因为这些方法是监视器的方法。监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。
*/
class Resource {
String name;
String sex;
boolean flag = false;
}
//输入
class Input implements Runnable {
Resource r;
// Object obj = new Object();
Input(Resource r) {
this.r = r;
}
public void run() {
int x = 0;
while (true) {
synchronized (r) {
if (r.flag == true)
try {
r.wait();
} catch (InterruptedException e) {
}
if (x == 0) {
r.name = "mike";
r.sex = "nan";
} else {
r.name = "丽丽";
r.sex = "女女女女女女";
}
r.flag = true;
r.notify();
}
x = (x + 1) % 2;
}
}
}
/*
* 执行过程:
* 1,若t1线程先拿到锁,执行上面 if (x == 0),r.flag = true,释放锁。
* 2,接着t2拿到锁执行下面 System.out.println(r.name + "....." + r.sex); r.flag = false;
3,如果t2再次拿到锁,但是flag = false,所以进入等待模式释放r锁,该t1执行上面else语句接着 r.notify();唤醒t2进行输出
4,如果t1再次拿到锁同样进入等待(就是t1可能改两次名的情况)
*
* */
//输出
class Output implements Runnable {
Resource r;
// Object obj = new Object();
Output(Resource r) {
this.r = r;
}
public void run() {
while (true) {
synchronized (r) {
if (r.flag == false)
try {
r.wait();
} catch (InterruptedException e) {
}
System.out.println(r.name + "....." + r.sex);
r.flag = false;
r.notify();
}
}
}
}
class ResourceDemo2 {
public static void main(String[] args) {
//创建资源。
Resource r = new Resource();
//创建任务。
Input in = new Input(r);
Output out = new Output(r);
//创建线程,执行路径。
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
//开启线程
t1.start();
t2.start();
}
}
多线程间的等待唤醒简单理解
最新推荐文章于 2024-08-21 16:50:39 发布
本文通过实例详细介绍了Java中线程间的等待/唤醒机制,包括wait(), notify() 和 notifyAll() 方法的使用,并展示了如何通过synchronized关键字实现线程同步。
1258

被折叠的 条评论
为什么被折叠?



