日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java生产者与消费者问题_java生产者与消费者问题

發(fā)布時(shí)間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java生产者与消费者问题_java生产者与消费者问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為了回憶一下J2SE中的線程互斥與同步問題,所以今天就寫個(gè)生產(chǎn)者與消費(fèi)者問題。這個(gè)程序大部分時(shí)間的結(jié)果都基本正確,但某些時(shí)候會(huì)造成死鎖。百思不得其解,將代碼貼上,方便以后有更深的體會(huì)時(shí)再進(jìn)行修改。也方便各位同學(xué)借鑒與指正。

代碼如下:

import java.util.ArrayList;

import java.util.logging.Level;

import java.util.logging.Logger;

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

/**

*

* @author passzh

* 2010.11.7 10:30pm

* the problem of producter and consumer

*/

public class ProductAndConsumer {

public static void main(String[] args)

{

MyFun my=new MyFun();

}

}

class MyFun

{

//設(shè)置signal

static Integer empty=4;

static Integer full=0;

static Integer matrix=1;

//被掛起的線程的隊(duì)列

ArrayList list_p=new ArrayList();

ArrayList list_c=new ArrayList();

public MyFun()

{

Producter[] producter=new Producter[4];

Consumer[] consumer=new Consumer[4];

for(int i=0;i<4;i++)

{

producter[i]=new Producter(i);

consumer[i]=new Consumer(i);

producter[i].start();

consumer[i].start();

}

}

//定義PV操作

public void p(MyThread mythread,int tag)

{

//tag==1是為生產(chǎn)者,為2時(shí)是消費(fèi)者

if(tag==1)

{

synchronized(MyFun.empty)

{

MyFun.empty--;

//System.out.println("p操作empty="+MyFun.empty);

}

if(MyFun.empty<0)

{

try {

synchronized(mythread)

{

//String name=tag==1?"生產(chǎn)者":"消費(fèi)者";

System.out.println("生產(chǎn)者"+mythread.getNo()+"被掛起");

list_p.add(mythread);

mythread.wait();

}

} catch (InterruptedException ex) {

Logger.getLogger(ProductAndConsumer.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

else if(tag==2)

{

synchronized(MyFun.full)

{

MyFun.full--;

//System.out.println("p操作full="+MyFun.full);

}

if(MyFun.full<0)

{

try {

synchronized(mythread)

{

//String name=tag==1?"生產(chǎn)者":"消費(fèi)者";

System.out.println("消費(fèi)者"+mythread.getNo()+"被掛起");

list_c.add(mythread);

mythread.wait();

}

} catch (InterruptedException ex) {

Logger.getLogger(ProductAndConsumer.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

}

//定義V操作

public void v(int tag)

{

if(tag==1)

{

synchronized(MyFun.full)

{

MyFun.full++;

//System.out.println("v操作full="+MyFun.full);

}

if(MyFun.full<=0)

{

//System.out.println();

if(list_c.size()>0)

{

MyThread thr=list_c.get(0);

synchronized(thr)

{

list_c.remove(0);

thr.notify();

System.out.println("消費(fèi)者"+thr.getNo()+"被喚醒");

}

}

}

}

else if(tag==2)

{

synchronized(MyFun.empty)

{

MyFun.empty++;

//System.out.println("v操作empty="+MyFun.empty);

}

if(MyFun.empty<=0)

{

if(list_p.size()>0)

{

MyThread thr=list_p.get(0);

synchronized(thr)

{

list_p.remove(0);

thr.notify();

System.out.println("生產(chǎn)者"+thr.getNo()+"被喚醒");

}

}

}

}

}

class MyThread extends Thread

{

protected int no;

public int getNo()

{

return this.no;

}

}

class Producter extends MyThread

{

public Producter(int n)

{

this.no=n;

}

public void run()

{

synchronized(this)

{

p(this,1);

System.out.println("生產(chǎn)者"+this.getNo()+"生產(chǎn)一個(gè)產(chǎn)品");

v(1);

}

}

}

class Consumer extends MyThread

{

public Consumer(int n)

{

this.no=n;

}

public void run()

{

synchronized(this)

{

p(this,2);

System.out.println("消費(fèi)"+this.getNo()+"消費(fèi)一個(gè)產(chǎn)品");

v(2);

}

}

}

}

and result:

result 1:

生產(chǎn)者0生產(chǎn)一個(gè)產(chǎn)品

生產(chǎn)者1生產(chǎn)一個(gè)產(chǎn)品

消費(fèi)0消費(fèi)一個(gè)產(chǎn)品

消費(fèi)1消費(fèi)一個(gè)產(chǎn)品

生產(chǎn)者2生產(chǎn)一個(gè)產(chǎn)品

生產(chǎn)者3生產(chǎn)一個(gè)產(chǎn)品

消費(fèi)2消費(fèi)一個(gè)產(chǎn)品

消費(fèi)3消費(fèi)一個(gè)產(chǎn)品

result2:

生產(chǎn)者0生產(chǎn)一個(gè)產(chǎn)品消費(fèi)1消費(fèi)一個(gè)產(chǎn)品消費(fèi)者0被掛起生產(chǎn)者1生產(chǎn)一個(gè)產(chǎn)品消費(fèi)者0被喚醒消費(fèi)0消費(fèi)一個(gè)產(chǎn)品消費(fèi)者2被掛起消費(fèi)者3被掛起生產(chǎn)者2生產(chǎn)一個(gè)產(chǎn)品消費(fèi)者2被喚醒消費(fèi)2消費(fèi)一個(gè)產(chǎn)品生產(chǎn)者3生產(chǎn)一個(gè)產(chǎn)品消費(fèi)者3被喚醒消費(fèi)3消費(fèi)一個(gè)產(chǎn)品

總結(jié)

以上是生活随笔為你收集整理的java生产者与消费者问题_java生产者与消费者问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。