博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中线程的通讯
阅读量:5010 次
发布时间:2019-06-12

本文共 2723 字,大约阅读时间需要 9 分钟。

线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务。

Object类中相关的方法有两个notify方法和三个wait方法:因为wait和notify方法定义在Object类中,因此会被所有的类所继承。

这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。

wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。

  wait():使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。它不同于sleep(),当线程调用了wait()方法时,它会释放掉对象的锁。

  notify():唤醒一个等待当前对象的锁的线程。

举个栗子:生产者和消费者之间的关系

/* 线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.wait():  如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。notify():唤醒线程池等待线程其中的一个。notifyAll() : 唤醒线程池所有等待线程。wait与notify方法要注意的事项:    1. wait方法与notify方法是属于Object对象 的。    2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。    3. wait方法与notify方法必需要由锁对象调用。*///产品类class Product{    String name;  //名字    double price;  //价格    boolean flag = false; //产品是否生产完毕的标识,默认情况是没有生产完成。}//生产者class Producer extends Thread{    Product  p ;      //产品    public Producer(Product p) {        this.p  = p ;    }    @Override    public void run() {        int i = 0 ;         while(true){         synchronized (p) {            if(p.flag==false){                 if(i%2==0){                     p.name = "苹果";                     p.price = 6.5;                 }else{                     p.name="香蕉";                     p.price = 2.0;                 }                 System.out.println("生产者生产出了:"+ p.name+" 价格是:"+ p.price);                 p.flag = true;                 i++;                 p.notifyAll(); //唤醒消费者去消费            }else{                //已经生产 完毕,等待消费者先去消费                try {                    p.wait();   //生产者等待                } catch (InterruptedException e) {                    e.printStackTrace();                }            }         }           }        }}//消费者class Customer extends Thread{    Product p;     public  Customer(Product p) {        this.p = p;    }    @Override    public void run() {        while(true){            synchronized (p) {                    if(p.flag==true){  //产品已经生产完毕                    System.out.println("消费者消费了"+p.name+" 价格:"+ p.price);                    p.flag = false;                     p.notifyAll(); // 唤醒生产者去生产                }else{                    //产品还没有生产,应该 等待生产者先生产。                    try {                        p.wait(); //消费者也等待了...                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }        }}public class Demo {    public static void main(String[] args) {        Product p = new Product();  //产品        //创建生产对象        Producer producer = new Producer(p);        //创建消费者        Customer customer = new Customer(p);        //调用start方法开启线程        producer.start();        customer.start();    }}

 

转载于:https://www.cnblogs.com/qicao/p/9069653.html

你可能感兴趣的文章
优雅使用mybatis
查看>>
设计模式学习之旅-抽象工厂模式
查看>>
接口测试(java+testng+ant+jenkins)第四篇jenkins
查看>>
Docker折腾手记-linux下安装
查看>>
Log4net入门使用
查看>>
NSLayoutConstraint 使用详解 VFL使用介绍
查看>>
Node.js中流程控制
查看>>
Netdata 服务器前端监控平台
查看>>
JSP内置对象概述
查看>>
安装 Tesserocr (填坑)
查看>>
freemarker对html里多行表格操作
查看>>
VM配置文件所在磁盘空间小于其配给内存时的错误信息
查看>>
ThinkCMF5.1主要特性
查看>>
CSS布局技巧
查看>>
mysqlimport 导入文件到数据库命令
查看>>
codeup 算法笔记【递归入门】组合+判断素数
查看>>
Linux开启关闭redis
查看>>
Application.Current的使用
查看>>
3487. 【NOIP2013模拟联考11】剑与魔法(dragons) (Standard IO)
查看>>
5791. 【NOIP2008模拟】阶乘
查看>>