线程唤醒机制

Object类中提供了三个方法

  1. wait()等待
  2. notify() 唤醒单个线程
  3. notifyAll() 唤醒所有线程
public class Student {
    String name;
    int age;
    boolean flag;
}

public class SetThread implements Runnable {
    private Student s;
    private int x = 0;

    public SetThread(Student s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            //注意:加锁必须是同一把
            synchronized(s){//加锁同时获取的也应该加锁
                if(s.flag){
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            if (x % 2 == 0) {
                s.name = "0";
                s.age = 19;
            } else {
                s.name = "1";//这里是有线程问题的。线程一走进来接着又走进来一个线程二,内存就会有改变,所以要加锁
                s.age = 25;
            }
            x++;

            //修改标记
                s.flag=true;
                //唤醒
                s.notify();
            }
        }
    }
}


public class GetThread implements Runnable {
    private Student s;

    public GetThread(Student s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            //注意:加锁必须是同一把
            synchronized(s){
                if(!s.flag) {//没有东西为true
                    try {
                        s.wait();//等待,立即释放锁,将来唤醒从这里唤醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                    System.out.println(s.name + "---" + s.age);

                //修改标记
                s.flag=false;
                //唤醒
                s.notify();
            }
        }
    }
}


/*
* 线程安全问题:
*       A:是否是多线程
*       B:是否是共享数据
*       C:是否是多条语句操作数据
* */

public class StudentDemo {
    public static void main(String[] args) {
        Student s=new Student();

        SetThread st=new SetThread(s);
        GetThread gt=new GetThread(s);

        Thread t=new Thread(st);
        Thread t2=new Thread(gt);

        t.start();
        t2.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TL。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值