java多线程生产者与消费者问题_java多线程实现生产者与消费者问题
生產(chǎn)者與消費者多線程實現(xiàn),首先的問題就是同步,就是關(guān)于臨界資源的訪問
我們首先來定義一個臨界資源類,這里設(shè)為Q
class Q
{ int z=4;
}
這個int型的z就是我假設(shè)的臨界資源的個數(shù)
然后是生產(chǎn)者的put動作
synchronized void put()
{
if(z>0)//當(dāng)臨界資源的個數(shù)大于0時,生產(chǎn)者等待wait,否則,生產(chǎn)者進行生產(chǎn),生產(chǎn)之后喚醒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)//當(dāng)臨界資源的個數(shù)等于或者小于0時,消費者進程等待
{
try{wait();}catch(Exception e){}
}
else
{
System.out.print(Thread.currentThread().getName()+"?? ");
System.out.println(z--);
if(z==0)//當(dāng)一個消費者消費完之后檢查了一下臨界資源,發(fā)現(xiàn)資源為0,那么喚醒生產(chǎn)者來進行生產(chǎn)
{
notify();
}
}
}
然后是生產(chǎn)者和消費者類的定義
這里的生產(chǎn)者和消費者都是Thread類的子類,故都要完成run方法,這里run方法一般為無限循環(huán)
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();
}
}
}
這里需要注意,因為只能生產(chǎn)一個臨界資源對象,這里我們放在主函數(shù)里面,所以,需要構(gòu)造生產(chǎn)者和消費者的構(gòu)造函數(shù),并將臨界資源作為參數(shù)傳遞進來,進行put與get操作
整個函數(shù)定義如下:
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();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java多线程生产者与消费者问题_java多线程实现生产者与消费者问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ntpudpclient_Ja
- 下一篇: java源码 1.8_Java源码下载和