java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的

不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的。

但是在多个线程之间就会有问题

  1 /*
  2  * 这个例子用来解释多个生产者和多个消费者的情况
  3  */
  4
  5 /*
  6  * 资源库
  7  */
  8 class Resource
  9 {
 10     private String name;
 11     private int count = 1;
 12     private boolean flag = false;
 13     public synchronized void set (String name){
 14
 15         while (flag)
 16             try {this.wait();}
 17             catch(Exception e){
 18
 19             }
 20             this .name = name + "--" + count++;
 21             System.out.println(Thread.currentThread().getName()+"生产商品"+this.name);
 22             flag = true;
 23             this.notifyAll();
 24
 25         }
 26
 27
 28     public synchronized void out(){
 29         while (!flag)
 30             try {this.wait();}
 31             catch(Exception e){
 32
 33             }
 34             System.out.println(Thread.currentThread().getName() + "消费了" + this.name);
 35             flag = false;
 36             this.notifyAll();
 37         }
 38
 39     }
 40
 41 /*
 42  * 生产者
 43  */
 44 class Producer implements Runnable
 45 {
 46     private Resource res;
 47     Producer (Resource res){
 48
 49         this.res = res;
 50     }
 51     public void run(){
 52
 53         while (true){
 54
 55             res.set ("牙膏");
 56         }
 57     }
 58
 59
 60 }
 61 /*
 62  * 消费者
 63  */
 64 class Consumer implements Runnable
 65 {
 66
 67     private Resource res;
 68     Consumer(Resource res){
 69
 70         this.res = res;
 71     }
 72     public void run(){
 73
 74         while (true){
 75             res.out();
 76         }
 77     }
 78 }
 79 public class producerConsumerDemo {
 80
 81     public static void main(String[] args) {
 82         // TODO Auto-generated method stub
 83         Resource res = new Resource();
 84
 85         Producer p1 = new Producer(res);
 86         Producer p2 = new Producer(res);
 87
 88         Consumer c1 = new Consumer(res);
 89         Consumer c2 = new Consumer(res);
 90
 91         Thread t1 = new Thread(p1);
 92         Thread t2 = new Thread(p2);
 93         Thread t3 = new Thread(c1);
 94         Thread t4 = new Thread(c2);
 95
 96         t1.start();
 97         t2.start();
 98         t3.start();
 99         t4.start();
100
101
102
103     }
104
105 }
时间: 2024-12-19 20:21:08

java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)的相关文章

java中多线程通信实例:生产者消费者模式

线程间的通信: 其实就是多个线程再操作同一个资源,但是操作的动作不同   当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源. Java中的 wait(),notify(),notifyAll()可以实现线程间的通信. 生产者--消费者问题是典型的线程同步和通信问题 /** * 生产者和消费者问题,生产者生成出产品,消费者去购

Java 中多线程

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的.这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到. 0.Java 中多线程同步是什么? 在多线程程序下,同步能控制对共享资源的访问.如果没有同步,当一个 Java 线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果. 1.解释实现多线程的几种方法? 一

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

java中多线程的实例代码

今天开始学习java中的多线程,在看书的过程中写了一个实例来练习多线程的用法,下面把代码放到博文里,里面很多的注释,可以帮助理解.     运行结果如下: main:启动MessageLoop线程...main:等待MessageLoop线程结束...main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息1main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息2main:继续等待.main:继续等待.

Java中动态代码块,构造代码块,静态代码块之间的执行顺序

Java中动态代码块,构造代码块,静态代码块之间的执行顺序 /** * Java中动态代码块,构造代码块,静态代码块之间的执行顺序 * @author Administrator * */ class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("st

java中多线程执行时,为何调用的是start()方法而不是run()方法

Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,一旦得到CPU时间片,就自动开始执行run()方法.此时不需要等待run()方法执行完也可以继续执行下面的代码,所以也由此看出run()方法并没有实现多线程. 2,run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的.如果直接调用run(),其实就相当

生产者与消费者模式(线程的同步与互斥)

死锁产生的四个条件: 1.互斥使用(资源独占) 一个资源每次只能给一个进程使用 .2.不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 .3.请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) .4.循环等待 存在一个进程等待队列 {P1 , P2 , - , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,-,Pn等待P1占有的资源,形成一个进程等待环路 生产者:生产数据

java 中多线程之间的通讯之等待唤醒机制

wait notify () nitifyAll () 都使用在同步中,因为要对持有监视器(锁)的线程操作 所以要使用在同步中,因为只有同步才具有锁 为什么这些操作线程的方法要定义object类中呢 因为这些方法在操作同步中线程时.都必须要标识他们所操作线程只有的锁 只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒 不可以对不同锁中的线程进行唤醒 也就是说,等待和唤醒必须是同一个锁 而锁可以使任意对象,所以可以被任意对象调用的方法定义object类中 1 class Res 2 {

黑马程序员------Java中多线程学习总结(二)

Java培训.Android培训.iOS培训..Net培训,期待您的交流 在Java多线程中,如果有多个线程同时操作共享数据时,就可能会发生数据异常 如下面这段代码: /* * 模拟卖票 */ class Ticket implements Runnable { private int tick = 10; Object obj = new Object(); public void run() { while(true) { if(tick>0) { try{Thread.sleep(10);