wait(),notify(),notifyAll() 这些方法存在与同步中。使用这些方法时必须要标识所属的同步的锁。同一个锁上wait的线程,只可以被同一个锁上的notify唤醒。 那么当一个线程被wait()后,另一个线程就可获取执行资格。那么就是说现在两个线程在形式上都存在于synchronized(p){}的括号范围内,但是它们不可能同时获得锁。所以说,与其说wait(),notify(),notifyAll() 这些方法控制的是线程,不如说它们控制的是锁。 - /**
- * 线程间通信示例
- * 思路:
- * 1、创建资源类
- * 2、创建对资源不同的操作类
- * 3、创建两个线程分别控制两个操作
- * @author 王艳静
- *
- */
- //定义资源类
- class Person{
- String name;
- String sex;
- boolean flag = false;
- }
- //定义对资源的设置类
- class SetPerson implements Runnable{
- Person p;
- int i = 0;
- SetPerson(Person p){
- this.p = p;
- }
- @Override
- public void run() {
- while(true){
-
- synchronized(p){
- if(p.flag)
- try {p.wait();} catch (InterruptedException e) {}
- if(i==0){
- p.name = "小妖";
- p.sex = "女";
-
- }
- else{
- p.name = "Pixy";
- p.sex = "girl";
- }
- i = (i+1)%2;
- p.flag=true;
- p.notify();
- }
- }
- }
- }
- //定义对资源的输出类
- class GetPerson implements Runnable{
- Person p;
- GetPerson(Person p){
- this.p = p;
- }
- @Override
- public void run() {
- while(true)
- synchronized (p) {
- if(!p.flag)
- try {p.wait();} catch (InterruptedException e) {}
- System.out.println(p.name+"----"+p.sex);
- p.flag = false;
- p.notify();
- }
- }
- }
- //测试类
- public class InputOutputDemo {
- public static void main(String[] args) {
- //创建资源
- Person p = new Person();
- //创建线程,传入资源并启动
- new Thread(new SetPerson(p)).start();
- new Thread(new GetPerson(p)).start();
- }
- }
复制代码
|