Java中等待唤醒机制

使用的是继承自Object的两个方法

public final void wait() throws InterruptedException
线程等待

public final void notify()
唤醒在此对象监视器上等待的单个线程

自定义类,定义信息

public class People {
    
    String name ;
    int age ;    
    boolean flag; //默认没有数据,如果是true,说明有数据
}

设置数据

public void run() {
    //设置学生数据
    while(true) {
        synchronized (s) {
            //判断有没有数据的情况
            if(s.flag) {
                    
                try {
                    s.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if(x%2 ==0) {
                s.name = "1" ;    
                s.age = 20 ;
            }else {
                s.name = "2";

                s.age = 30 ;
            }
            x++ ;
                
            //如果有数据了,更改flag值
            s.flag = true ;//有数据了
            //通知t2线程消费数据,唤醒
            s.notify();  //唤醒t2线程,唤醒之后t1,t2都互相抢占
                
        }
            
    }
        
}

输出数据

public void run() {  
    //输出该学生数据
    while(true) {
        synchronized (s) {
            //如果本身消费者有数据
            if(!s.flag) {
                try {
                    s.wait();//和网络编程中TCP编程里面的accept() 都属于阻塞式方法
                             //消费线程等待,等待该线程先输出这些数据(立即释放锁对象)
                        
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(s.name +"----"+s.age);//输出名字和年龄
                
            //如果没有数据类,
            s.flag = false ;
            //通知t1线程,赶紧产生数据
            s.notify(); //唤醒单个线程
        }

            
    }
        
}

主函数

public static void main(String[] args) {
        
        //针对同一个对象进行操作
        People s = new People() ;
        
        //创建线程类对象
        SetThread st = new SetThread(s) ;//public Thread(Runnable target)分配新的 Thread 对象
        GetThread gt = new GetThread(s) ;
        
        //创建线程了对象
        Thread t1 = new Thread(st) ; //生产者
        Thread t2 = new Thread(gt) ;//消费者
        
        //启动线程
        t1.start();
        t2.start();
        
    
}

你可能感兴趣的:(Java)