Java 线程通信

一、实现线程间通信

        (1)Java提供了如下3个方法实现线程之间的通信

               1.wait()方法:调用wait()方法会挂起当前线程,并释放共享资源的锁。
               2.notify()方法:调用任意对象的notify()方法会在因调用该对象的wait()而阻塞的线程中随机选择一个线程解除阻塞,但要等到获得锁后才真正执行。
               3.notifyAll()方法:调用了notifyAll()方法会将因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞。

        (2) wait()、notify()和notifyAll()

                这3个方法都是Object类中final方法,被所有的类继承且不允许重写。这3个方法只能在同步方法或者同步代码块中使用,否则会抛出异常。

二、代码实现  吃货餐桌厨师 之间的线程通信

         厨师:

package com.waitnotifyall;

public class Cookie implements Runnable {
    
    // 重写run()方法
    @Override
    public void run() {
        while (true) {
            // 同步代码块
            synchronized (Desk.lock) {
                // 判断食物总数 为0 就结束
                if (Desk.count == 0) {
                    break;
                } else {
                    // 食物还有时 判断桌子上是否有食物   没有则唤醒制作
                    if (Desk.foodState == 0) {
                        Desk.lock.notifyAll();
                        // 食物状态
                        Desk.foodState = 1;
                    } else {
                        // 桌子上有食物 让自己等待  吃货吃完
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
    }
}

        吃货: 

package com.waitnotifyall;

public class Eater implements Runnable {
    // 重写run()方法
    @Override
    public void run() {
        while (true) {
            // 同步代码块
            synchronized (Desk.lock) {
                // 食物总数没有了 结束线程
                if (Desk.count == 0) {
                    break;
                } else {
                    // 如果总数有 判断食物状态
                    if (Desk.foodState == 1) {
                        // 状态为1 即桌子上有食物  唤醒吃货开吃
                        Desk.lock.notifyAll();
                        // 吃完减1
                        Desk.count--;
                        Desk.foodState = 0;
                        System.out.println("吃货开始。。。还能吃" + Desk.count + "碗。");
                    } else {
                        // 状态为0 即桌子上没有食物 吃货等待  厨师制作
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }


    }
}

        餐桌:

package com.waitnotifyall;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Desk {
    /*
     *
     * 吃货和厨师案例
     * 桌子上有食物 吃货吃
     * 桌子上没食物 厨师做
     * 一共做十次
     *
     * */

    // 食物总数
    public static int count = 10;
    // 桌子上有没有食物
    public static int foodState = 0;
    // 锁对象
    public static final Lock lock = new ReentrantLock();


    // 主进程
    public static void main(String[] args) {
        // 创建线程任务
        Eater eater = new Eater();
        Cookie cookie = new Cookie();

        // 创建线程对象
        Thread thread = new Thread(eater, "吃货");
        Thread thread1 = new Thread(cookie, "厨师");

        // 让进程就绪
        thread.start();
        thread1.start();
    }
}

 

        

你可能感兴趣的:(java,jvm,开发语言)