当前位置: 代码迷 >> 综合 >> Java线程之间相互通信wait()notify()
  详细解决方案

Java线程之间相互通信wait()notify()

热度:28   发布时间:2023-10-21 07:40:39.0

所有类(对象)继承自Object类均实现了notify与wait方法

Java线程之间相互通信wait()notify()

 解释一下线程的六种状态

BLOCKED
          受阻塞并且正在等待监视器锁的某一线程的线程状态。
NEW
          至今尚未启动的线程的状态。
RUNNABLE
          可运行线程的线程状态。
TERMINATED
          已终止线程的线程状态。
TIMED_WAITING
          具有指定等待时间的某一等待线程的线程状态。
WAITING
          某一等待线程的线程状态。

 创建三个类

BaoZi(此类作为对象监视器使用,且确保始终是同一个对象)

package com.myThread;public class BaoZi {String  pier ;String  xianer ;boolean  flag = false ;//包子资源 是否存在  包子资源状态
}

BaoZiPu(为 一个执行周期内第一个执行的类)此类实现了Runnable接口,亦可继承Thread类

package com.myThread;public class BaoZiPu implements Runnable {private BaoZi baozi;public BaoZiPu(BaoZi baozi) {this.baozi = baozi;}@Overridepublic void run() {int count = 0;//造包子while (true) {//同步synchronized (baozi) {if (baozi.flag == true) {//包子资源  存在try {baozi.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 薄皮  牛肉大葱baozi.pier = "薄皮";baozi.xianer = "牛肉大葱";baozi.flag = true;System.out.println("包子造好了:" + baozi.pier + baozi.xianer + System.currentTimeMillis());try {//为了实现线程输出不是那么快,让所有线程睡3sThread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//唤醒等待线程 (吃货)baozi.notify();}}}
}

ChiHuo

package com.myThread;public class ChiHuo implements Runnable {private BaoZi baoZi;public ChiHuo(BaoZi baoZi) {this.baoZi = baoZi;}@Overridepublic void run() {while (true) {synchronized (baoZi) {if (baoZi.flag == false) {//没包子try {baoZi.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("吃货吃到了" + baoZi.pier + baoZi.xianer + "包子" + System.currentTimeMillis());baoZi.flag = false;baoZi.notify();}}}
}

  注意,单独创建线程的(相对于使用线程池创建),在执行run()方法时出现异常线程会终止的,建议run()方法捕获异常 

ChiHuo、BaoZiPu都有BaoZi属性,并且此属性设值放在了构造方法中

Test

public class Test {public static void main(String[] args) {BaoZi baoZi = new BaoZi();
//实现接口的方式 需要通过new Thread的方式创建线程
//Thread(Runnable target) 分配新的 Thread 对象。
//。 通过 start()方法运行new Thread(new BaoZiPu(baoZi)).start();new Thread(new ChiHuo(baoZi)).start();//        这两个方式需要 BaoZiPu、ChiHuo 继承Threadl 类
//        new BaoZiPu(baoZi).start();//        new ChiHuo(baoZi).start();}
}

执行结果

包子造好了:薄皮牛肉大葱1628212510191
吃货吃到了薄皮牛肉大葱包子1628212513191
包子造好了:薄皮牛肉大葱1628212513191
吃货吃到了薄皮牛肉大葱包子1628212516191
包子造好了:薄皮牛肉大葱1628212516191
吃货吃到了薄皮牛肉大葱包子1628212519191
包子造好了:薄皮牛肉大葱1628212519191

 因为是线程间的通信,只能用THread.sleep 方法停止。不可使用 wait(long timeout)、wait(long timeout, int nanos)

Thread构造方法摘要

Thread()
          分配新的 Thread 对象。
Thread(Runnable target)
          分配新的 Thread 对象。
Thread(Runnable target, String name)
          分配新的 Thread 对象。
Thread(String name)
          分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target)
          分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target, String name)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小
Thread(ThreadGroup group, String name)
          分配新的 Thread 对象。

  相关解决方案