我做了produce-comsume的模型
可是不能按照要求,就是我自己控制线程,必须是生产一个,消费一个,生产一个消费一个,怎么办?
下面是三个类
public class Consumer extends Thread{
private ShareData data;
Consumer(ShareData data){
this.data = data;
}
public void run(){
int product=0;
for(int i=0;i<10;i++){
try{
product=data.getShareData();
System.out.println(" Consuming Num "+product);
}catch(InterruptedException e){}
}
}
}
import java.util.Random;
public class Producer extends Thread{
private ShareData data;
Producer(ShareData data){
this.data = data;
}
public void run(){
for(int i=0;i<10;i++){
try{
data.setShareData(i);
System.out.println("Producing Num " + i);
}catch(InterruptedException e){};
}
}}
public class ShareData{
private int data;
private boolean produceable = true;
public synchronized void setShareData(int data ) throws InterruptedException{
if (!produceable){
wait(); }
this.data =data;
produceable = false;
notify();
}
public synchronized int getShareData() throws InterruptedException{
if (produceable){
wait(); }
produceable = true;
notify();
return this.data;
}
}
可是不能按照要求,就是我自己控制线程,必须是生产一个,消费一个,生产一个消费一个,怎么办?
下面是三个类
public class Consumer extends Thread{
private ShareData data;
Consumer(ShareData data){
this.data = data;
}
public void run(){
int product=0;
for(int i=0;i<10;i++){
try{
product=data.getShareData();
System.out.println(" Consuming Num "+product);
}catch(InterruptedException e){}
}
}
}
import java.util.Random;
public class Producer extends Thread{
private ShareData data;
Producer(ShareData data){
this.data = data;
}
public void run(){
for(int i=0;i<10;i++){
try{
data.setShareData(i);
System.out.println("Producing Num " + i);
}catch(InterruptedException e){};
}
}}
public class ShareData{
private int data;
private boolean produceable = true;
public synchronized void setShareData(int data ) throws InterruptedException{
if (!produceable){
wait(); }
this.data =data;
produceable = false;
notify();
}
public synchronized int getShareData() throws InterruptedException{
if (produceable){
wait(); }
produceable = true;
notify();
return this.data;
}
}
public class procus
{
public static void main(String[] args)
{
ShareData ds=new ShareData();
Consumer c=new Consumer(ds);
Producer p=new Producer(ds);
p.start();
c.start();
try{
p.join();
c.join();
}catch(InterruptedException e)
{
}
}
}
package ProducerConsumer;
import java.io.*;
class CircularBuffer
{
int bufsize;
int[] store;
int numOfEntries=0;
int front=0;
int back=0;
CircularBuffer(int n)
{
bufsize=n;
store=new int[bufsize];
}
synchronized void put(int obj)throws Exception{
if(numOfEntries==bufsize)
{
System.out.println("Producer waiting");
wait();
}
store[back]=obj;
back++;
if(back==bufsize) back=0;
else {numOfEntries++;
System.out.println("putting "+ obj);
notify();
}
}
synchronized int get() throws Exception{
int result=0;
if(numOfEntries==0)
{
System.out.println("Consumer waiting");
wait();
}
else{
result=store[front];
front++;
if(front==bufsize) front=0;
numOfEntries--;
System.out.println("getting "+result);//;
notify();
}
return result;
}
}
package ProducerConsumer;
class Consumer extends Thread
{
CircularBuffer cbc=null;
Consumer(CircularBuffer cb)
{cbc=cb;}
public void run(){
for(int i=0;i<=50000;i++)
try{
cbc.get();
}
catch (Exception err){
}
}
}
import java.io.*;
class ProCum{
public static void main(String[] args){
CircularBuffer cb=new CircularBuffer(20);
//因为要调用的两个方法put和get是排斥,所以调用时由同一个对象调用,所以
?/都是cb,注意注意!!!!!!
Producer pro=new Producer(cb);
Consumer con=new Consumer(cb);
//
Thread a=null;
Thread b=null;
a=new Thread(pro);
b=new Thread(con);
b.start();
a.start();
}
}