文档章节

wait()和notify()实现生产消费模型

gaomq
 gaomq
发布于 2019/03/13 11:56
字数 332
阅读 52
收藏 0

最近复习起当初学习多线程的demo,记录一下用来以后巩固这方面的技术。

/**
 *   wait()和notify()实现生产消费模型
 *
 *   notify()唤醒不保证唤醒的是异类,也许是同类。如果写到两个类中可能出现假死进入WAITING状态
 * @Author: gaomq
 * @Date: 2019-03-13 11:38
 */
public class PC {

    private String lock;

    public PC(String lock){
        this.lock=lock;
    }

    public void setValue(){
        try {
            synchronized (lock){
                if(!ValueObject.value.equals("")){
                    lock.wait();
                }
                String value=System.currentTimeMillis()+"";
                System.out.println("set 值"+value);
                ValueObject.value=value;
                lock.notify();
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void getValue(){
        try {
            synchronized (lock){
                if(ValueObject.value.equals("")){
                    lock.wait();
                }
                System.out.println("get 值"+ValueObject.value);
                ValueObject.value="";
                lock.notify();
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}
/**
 *   生产线程
 *
 * @Author: gaomq
 * @Date: 2019-03-13 11:29
 */
public class ThreadP extends Thread{
    private PC pc;

    public ThreadP(PC pc){
        this.pc=pc;
    }

    @Override
    public void run() {
        while (true){
            pc.setValue();
        }
    }
}
/**
 * 消费线程
 *
 * @Author: gaomq
 * @Date: 2019-03-13 11:30
 */
public class ThreadC extends Thread{
    private PC pc;

    public ThreadC(PC pc){
        this.pc=pc;
    }
    @Override
    public void run() {
        while (true){
            pc.getValue();
        }
    }
}
/**
 *  测试类
 *
 * @Author: gaomq
 * @Date: 2019-03-13 11:31
 */
public class Run {
    public static void main(String[] args) {
        String lock=new String("lock");
        PC pc=new PC(lock);
        ThreadP p=new ThreadP(pc);
        ThreadC c=new ThreadC(pc);
        p.start();
        c.start();
    }
}

© 著作权归作者所有

gaomq

gaomq

粉丝 4
博文 71
码字总数 30170
作品 0
合肥
程序员
私信 提问
Java设计模式 - 生产者、消费者

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。 实际上,准确说应该是“生产者-消费者-仓储”模型,...

YuanyuanL
2015/08/10
296
0
JAVA线程6 - 线程间的通信

一、概述 线程之间需要一些协调通信,来共同完成一件任务。 二、线程间的通信 1. 线程交互 多个线程在处理同一资源,但是任务却不同。 其中涉及的三个方法 : wait():让线程处于阻塞状态,被w...

小米米儿小
2014/02/26
90
0
浅谈synchronized、wait、notify和notifyAll

一、概念解读 synchronized:同步锁,可修饰类、方法、代码块; wait:使当前线程进入等待状态,直到锁定对象被唤醒(notify、notifyAll),然后当前线程进入就绪状态;可指定最大等待时间,...

叫我宫城大人
2017/10/20
0
0
生产者—消费者模型

生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 这里实现如下情况的生产--消费模型: 生产者不断交替...

architect刘源源
2018/01/30
32
0
Java多线程学习(七)

等待/通知模式中最经典的案例当属生产者/消费者模式,此模式有几种变形,但都是基于wait/notify的。 生产者/消费者模式有两种类型:操作值的和操作栈的。下面分别从这两方面来讲解生产者/消费...

kakayang2011
2016/03/07
45
0

没有更多内容

加载失败,请刷新页面

加载更多

npm 发布webpack插件 webpack-html-cdn-plugin

初始化一个项目 npm init 切换到npm源 淘宝 npm config set registry https://registry.npm.taobao.org npm npm config set registry http://registry.npmjs.org 登录 npm login 登录状态......

阿豪boy
31分钟前
55
0
java基础(16)递归

一.说明 递归:方法内调用自己 public static void run1(){ //递归 run1(); } 二.入门: 三.执行流程: 四.无限循环:经常用 无限递归不要轻易使用,无限递归的终点是:栈内存溢出错误 五.递...

煌sir
36分钟前
35
0
REST接口设计规范总结

URI格式规范 URI中尽量使用连字符”-“代替下划线”_”的使用 URI中统一使用小写字母 URI中不要包含文件(脚本)的扩展名 URI命名规范 文档(Document)类型的资源用名词(短语)单数命名 集合(Co...

Treize
今天
57
0
CentOS-配置YUM源加速(阿里云、Nexus3)

备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6 $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/......

-自由人生-
今天
80
0
我如何获取一周中开始的DateTime?

我如何只知道C#中的当前时间来查找一周的开始(星期日和星期一)? 就像是: DateTime.Now.StartWeek(Monday); #1楼 丑陋,但至少可以给您正确的日期 通过系统设置星期开始时间: publ...

javail
今天
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部