javaSE基础编程——多线程(生产者和消费者)

来源:互联网 发布:调度算法有哪些 编辑:程序博客网 时间:2024/06/05 19:58


package com.cissst.software.model;

/**
 * 产品类
 * @author Administrator
 * @date 2015-8-10
 */
public class Product {

 //产品编号
 private int id;
 
 public Product(int id) {
  this.id = id;
 }

 public String toString() {
  return "Product:" + id;
 }

 public int getId() {
  return id;
 }

}


package com.cissst.software.model;

/**
 * 筐子类
 * @author Administrator
 * @date 2015-8-10
 */
public class Storage {
    /**
     * 筐子中存放6个产品
     */
 private Product[] cells = new Product[6];
 //当前栈顶指针
 private int inPos=0;
 /**
  * 往筐子中放入产品
  * @param product
  */
 public synchronized void push(Product product){
  //栈满
  while(inPos == cells.length){
   try {
    this.wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  cells[inPos] = product; 
  System.out.println(Thread.currentThread().getName()+"生产了第"+product.getId()+"个产品");
  inPos ++;
  this.notify();
 }
    /**
     * 从筐子中取出产品
     * @return
     */
 public synchronized Product pop(){
  while(inPos == 0){
   try {
    this.wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  inPos --;
  Product data = cells[inPos];
  System.out.println(Thread.currentThread().getName()+"消费了第"+data.getId()+"个产品");
  this.notify();
  return data;
 }

}


package com.cissst.software.Thread;

import com.cissst.software.model.Product;
import com.cissst.software.model.Storage;

public class ConsumeThread implements Runnable {

 private Storage storage ;
 public ConsumeThread(){
  
 }
 public ConsumeThread(Storage storage){
  this.storage = storage;
 }
 
 @Override
 public void run() {
  for(int i=1;i<=20;i++){
   
   Product product =storage.pop();
//   System.out.println("消费了第" +product.getId()+"个产品");
   
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

}


package com.cissst.software.Thread;

import com.cissst.software.model.Storage;

public class MainThread {

 /**
  * @param args
  */
 public static void main(String[] args) {
  
  Storage storage = new Storage();
  
  //创建生产者对象
  ProduceThread produce = new  ProduceThread(storage);
//  //启动生产线程
//  new Thread(produce).start();
  //创建第一个生产者线程
  Thread t1 = new Thread(produce,"生产一");
  t1.start();
  //创建第二个生产者线程
  Thread t2 = new Thread(produce,"生产二");
  t2.start();
  //创建消费者对象
  ConsumeThread consumeThread = new ConsumeThread(storage);
//  //启动消费线程
//  new Thread(consumeThread).start();
  //创建第一个消费者线程
  Thread c1 = new Thread(consumeThread,"消费者一");
  c1.start();
  //创建第二个消费者线程
  Thread c2 = new Thread(consumeThread,"消费者二");
  c2.start();
 }

}


package com.cissst.software.Thread;

import com.cissst.software.model.Product;
import com.cissst.software.model.Storage;


/**
 * 生产者线程:
 * 生产20个苹果
 * @author Administrator
 * @date 2015-8-10
 */
public class ProduceThread implements Runnable {

 private Storage storage ;
 public ProduceThread(){
  
 }
 public ProduceThread(Storage storage){
  this.storage = storage;
 }
 
 @Override
 public void run() {
  
  for(int i=1;i<=20;i++){
   Product product = new Product(i);
   storage.push(product);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

 }

}

0 0
原创粉丝点击