java多线程生产者与消费者问题_java多线程实现生产者与消费者问题
生產者與消費者多線程實現,首先的問題就是同步,就是關于臨界資源的訪問
我們首先來定義一個臨界資源類,這里設為Q
class Q
{ int z=4;
}
這個int型的z就是我假設的臨界資源的個數
然后是生產者的put動作
synchronized void put()
{
if(z>0)//當臨界資源的個數大于0時,生產者等待wait,否則,生產者進行生產,生產之后喚醒notifyAll()掛起的消費者
{
try{wait();}catch(Exception e){}
}
else
{
System.out.print(Thread.currentThread()+"?? ");
System.out.println(++z);
try{notifyAll();}catch(Exception e){}
}
}
然后是消費者進行消費的過程get
synchronized void get()
{
if(z<=0)//當臨界資源的個數等于或者小于0時,消費者進程等待
{
try{wait();}catch(Exception e){}
}
else
{
System.out.print(Thread.currentThread().getName()+"?? ");
System.out.println(z--);
if(z==0)//當一個消費者消費完之后檢查了一下臨界資源,發現資源為0,那么喚醒生產者來進行生產
{
notify();
}
}
}
然后是生產者和消費者類的定義
這里的生產者和消費者都是Thread類的子類,故都要完成run方法,這里run方法一般為無限循環
class producer extends Thread
{
Q q;
public producer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.put();
}
}
}
class consumer extends Thread
{
Q q;
public? consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.get();
}
}
}
這里需要注意,因為只能生產一個臨界資源對象,這里我們放在主函數里面,所以,需要構造生產者和消費者的構造函數,并將臨界資源作為參數傳遞進來,進行put與get操作
整個函數定義如下:
public class a
{
public static void main(String[]args)
{?? ?Q q=new Q();
Thread t1,t2,t3;
t1=new producer(q);
t2=new consumer(q);
t3=new consumer(q);
t1.start();
t2.start();
t3.start();
}
}
class Q
{
int z=4;
synchronized void put()
{
if(z>0)
{
try{wait();}catch(Exception e){}
}
else
{
System.out.print(Thread.currentThread()+"?? ");
System.out.println(++z);
try{notifyAll();}catch(Exception e){}
}
}
synchronized void get()
{
if(z<=0)
{
try{wait();}catch(Exception e){}
}
else
{
System.out.print(Thread.currentThread().getName()+"?? ");
System.out.println(z--);
if(z==0)
{
notify();
}
}
}
}
class producer extends Thread
{
Q q;
public producer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.put();
}
}
}
class consumer extends Thread
{
Q q;
public? consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.get();
}
}
}
總結
以上是生活随笔為你收集整理的java多线程生产者与消费者问题_java多线程实现生产者与消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ntpudpclient_Ja
- 下一篇: java源码 1.8_Java源码下载和