java多线程 生产者 消费者 问题 。。。

简介:   /* 每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。 我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。 也就是在同步快 或者同步函数中调用  wait  对于生产者消费者问题应该在同一个对象的等待队列中 当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
 

/*
每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。
我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。

也就是在同步快 或者同步函数中调用  wait  对于生产者消费者问题应该在同一个对象的等待队列中

当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
wait和notify主要用于producer-consumer这种关系中。

 

下面模拟 生产者 消费者问题
*/

class  Test 
{
 
 public static void main(String []args)
 {
  Queue q=new Queue();  //创建一个队列
  Procedure p=new Procedure(q); //生产者线程
  Consumer c=new Consumer(q);//消费者线程
  p.start();  //启动
  c.start();//run
 }
}


class  Procedure  extends Thread
{
 Queue q;
 Procedure(Queue q)  //带参数构造函数
 {
  this.q=q;
 }
 public  void run()
 {
  for(int i=0;i<100;i++)
  {
   q.put(i);  //向队列放数据
   System.out.println("Producer put "+i);  //显示队列数据
  }
  
  
 }

}

class  Consumer  extends Thread
{
 Queue q;
 Consumer(Queue q)
 {
  this.q=q;  //构造函数
 }
 public  void run() 
 {
  while(true)
  {
   int n=q.get();  //从队列获取 数据
   try
      {
        Thread.sleep(10);  //线程等待一下
      }
  catch(Exception e)
   {
    
   }
   System.out.println("Consumer get"+ n);
  }
  
 }

}

class  Queue //面向对象的思想 用类封装数据
{
 int i ;// 队列数据
 boolean bFull=false;
 public synchronized  int  get()   //同步方法
 {
  if(bFull==false)
  { try
   {
    wait() ;// 使消费者线程等待  wait方法会跑出异常 使当前线程进入 this对象的等待序列 
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }
  }
  bFull=false;  //如果有食物的话 设置食物为空 并且从this等待队列删除 线程
  notify();//从this对象等待序列删除线程
  return this.i; //返回i
 }
 
 
 public  synchronized void put(int i)
 {
  if(!bFull) //如果为空
  {
   this.i=i; //放入数据
   bFull=true; //设置为TRUE
   notify();//从等待队列删除线程 
  }
  try
  {
   wait();//如果食物不是空那么进入等待队列
  }
  catch(Exception e)
    {
     e.printStackTrace();
   }
 
     }
}


 

目录
相关文章
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
441 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
411 1
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
459 0
|
11月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
633 16
|
12月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
754 1
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
322 6
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(中)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
356 5