java 学习笔记 生产者与消费者

Object类对线程的支持——等待与唤醒

public final void wait() throws InterruptedException

public final void notify()

public final void notifyAll()

public class Test {
    public static void main(String[] args) {
         Basket basket = new Basket();

         Producter p1 = new Producter("p1",basket);
         Producter p2 = new Producter("p2",basket);
         Consumer c1 = new Consumer("c1",basket);
         Consumer c2 = new Consumer("c2",basket);    

         Thread t1 = new Thread(p1);
         Thread t2 = new Thread(p2);
         Thread t3 = new Thread(c1,"c1");
         Thread t4 = new Thread(c2,"c2");

         t1.start();
         t2.start();
         t3.start();
         t4.start();
    }
}

//定义面包类
class Bread {
    int id;
    String info;

    Bread (String info,int id) {
        this.info = info;
        this.id = id;
    }
}

//定义容器类
class Basket {
    int index = 0;//先进先出型
    Bread bread;
    Bread br[] = new Bread[10];//定义一个数组,容量为6

    public synchronized void putIn(Bread bread){
        while (index == br.length) {
            try {
                this.wait();
            }catch(InterruptedException e) {
                System.out.println("wait中被打断");
            }
        }
        this.notify();
        br[index] = bread;
        index++;
        System.out.println("(" + bread.info + "生产第" + bread.id + "个)  " + "现有" + this.index + "个");
    }

    public synchronized void takeOut(){
        while(index == 0 ) {
            try {
                this.wait();
            }catch(InterruptedException e) {
                System.out.println("wait中被打断");
            }
        }
        this.notify();
        index--;
        System.out.println(Thread.currentThread().getName() + "取走   " +"还剩" + index + " ");
    }
}

//定义生产者类
class Producter implements Runnable {
    Basket basket = null;
    String name = null;
    int j = 0;

    public Producter(String name,Basket basket) {
        this.name = name;
        this.basket = basket;
    }

    public void run() {
        for (int i = 0;i <= 15;i++) {
            j = i + 1;
            Bread bread = new Bread(this.name,j);//不需要成员变量含有Bread类 ,直接new出来
            basket.putIn(bread);
        }
    }
}

//定义消费者类
class Consumer implements Runnable{
    String name;
    Basket basket;

    public Consumer(String name,Basket basket){
        this.name = name;
        this.basket = basket;
    }

    public void run() {
        for (int i = 0;i <= 15;i++) {
            basket.takeOut();
        }
    }
}

/*
1.在 for语句循环内,不要对循环变量i进行操作
*/

时间: 2024-10-10 09:06:47

java 学习笔记 生产者与消费者的相关文章

java学习笔记14--多线程编程基础1

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂 多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易

Java学习笔记3-操作符

Java基本操作符:+.-.*./.%.=.==.!=.+=.-=. 优先级:先乘除后加减,如果是连接符+号会优先往前匹配,比如 a+++++b,会被解释称 a++ ++ +b,所以会报错,需要自行使用括号隔离为 (a++) + (++b). 对象的引用如果赋值给了对象的引用后,2 个对象将指向同一个引用,有一个对象的引用重新赋值后将同时影响到另一个对象,比如 ClassName classA = new ClassName(); ClassName classB = new ClassName

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要

java学习笔记8--接口总结

接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note8.html,转载请注明源地址. 生活中的接口: 什么是接口? 一个Java接口是一些方法特

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

java学习笔记一

只记录一些我认为比较必要,容易出错的地方.(不断更新中) 内存:分为四段,代码段code segment,数据段data segment,栈stack, 堆heap.记住如下图 数据类型: 1.java整形常量默认为int类型,当使用long类型时,因此需要添加“l”或“L”,一般用大写,小写像1.如long i = 888888888888L 2.浮点数时会默认为double类型,因此使用float时需要添加f.如 float i = 0.123f 3.java支持大数运算. 强制转换 flo