java多線程解決生產(chǎn)者消費(fèi)者問(wèn)題
本文實(shí)例講述了java多線程解決生產(chǎn)者消費(fèi)者問(wèn)題的方法。分享給大家供大家參考。具體分析如下:
題目是這樣的:
采用Java 多線程技術(shù),設(shè)計(jì)實(shí)現(xiàn)一個(gè)符合生產(chǎn)者和消費(fèi)者問(wèn)題的程序。對(duì)一個(gè)對(duì)象(槍膛)進(jìn)行操作,其最大容量是12顆子彈。生產(chǎn)者線程是一個(gè)壓入線程,它不斷向槍膛中壓入子彈;消費(fèi)者線程是一個(gè)射出線程,它不斷從槍膛中射出子彈。
要求:
(1)給出分析過(guò)程說(shuō)明。
(2)程序輸出,要模擬體現(xiàn)對(duì)槍膛的壓入和射出操作;
(2)設(shè)計(jì)程序時(shí)應(yīng)考慮到兩個(gè)線程的同步問(wèn)題。
這個(gè)和著名的生產(chǎn)者消費(fèi)者問(wèn)題幾乎是一樣的,這里做一下簡(jiǎn)單分析。
還是直接用代碼說(shuō)話吧,注釋寫的很明白
package test;
import java.util.ArrayList;
import java.util.List;
public class testGun {
public static void main(String[] args)
{
GunClip clip=new GunClip();
Producer p=new Producer(clip);
Concumer c=new Concumer(clip);
p.start();
c.start();
}
}
/* 首先我要有一個(gè)彈夾,*/
class GunClip //彈夾
{
private List<Integer> list=null;//用來(lái)放子彈
private boolean bFull =false ; //理解boolean變量很重要,表示滿沒(méi)滿
//函數(shù)功能,像彈夾中放子彈
public synchronized void put(List list){
if(!bFull){//意思是說(shuō)彈夾沒(méi)有滿,那么就像里面放子彈
this.list=list;
bFull=true;//放滿了子彈,在把boolean變量變?yōu)閠rue表示,彈夾滿了
notify();//通知,等待取子彈的線程來(lái)取子彈
}
//下面的try中得wait是當(dāng)彈夾滿了的情況下,
//即boolean為true,暫停本線程,等待取子彈
try{
wait();
}catch(Exception e){
e.printStackTrace();
}
}
public synchronized void get(){
if(!bFull){//如果彈夾沒(méi)滿那么就不能取子彈
try{
wait();//彈夾沒(méi)滿,所以取不了,只能等待,只有彈夾滿了才能取
}catch(Exception e){
e.printStackTrace();
}
}
//下面是彈夾滿了,那么我開(kāi)始取子彈
System.out.println("\n"+"機(jī)槍開(kāi)始射出子彈:"+"\n");
for(int i=list.size();i>0;i--){
int j=(Integer)list.get(i-1);
System.out.println("已射出第"+j+"顆子彈");
}
//彈夾被取空了,即沒(méi)子彈了,那么只能等待重新填充,
//所以boolean變?yōu)閒alse,表示沒(méi)滿,通知裝子彈的線程裝子彈
bFull=false;
notify();
}
}
//生產(chǎn)者,即裝子彈,下面和公告板差不多,要有一個(gè)彈夾的實(shí)體
class Producer extends Thread
{
private GunClip clip;
private List<Integer> list;
Producer(GunClip clip){
this.clip=clip;
}
public void run(){
for(int i=0;i<3;i++){ //讓它生產(chǎn)3個(gè)彈夾
list=new ArrayList();
System.out.println("\n"+"機(jī)槍開(kāi)始?jí)喝胱訌棧?+"\n");
for(int j=0;j<12;j++){
list.add(j+1);
System.out.println("已壓入第"+(j+1)+"顆子彈");
}
clip.put(list);
}
}
}
//消費(fèi)者,發(fā)射子彈
class Concumer extends Thread
{
private GunClip clip;
Concumer(GunClip clip){
this.clip=clip;
}
public void run(){
while(true){
clip.get();
}
}
}
希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。
- Java多線程并發(fā)生產(chǎn)者消費(fèi)者設(shè)計(jì)模式實(shí)例解析
- Java多線程生產(chǎn)者消費(fèi)者模式實(shí)現(xiàn)過(guò)程解析
- Java多線程 生產(chǎn)者消費(fèi)者模型實(shí)例詳解
- Java多線程 BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解
- Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解
- java 中多線程生產(chǎn)者消費(fèi)者問(wèn)題詳細(xì)介紹
- JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解
- 淺談java線程中生產(chǎn)者與消費(fèi)者的問(wèn)題
- JAVA生產(chǎn)者消費(fèi)者(線程同步)代碼學(xué)習(xí)示例
- Java如何通過(guò)線程解決生產(chǎn)者/消費(fèi)者問(wèn)題
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)雙向鏈表的示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表的示例,需要的朋友可以參考下2014-03-03
關(guān)于mybatis resulttype 返回值異常的問(wèn)題
這篇文章主要介紹了mybatis resulttype 返回值異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot中的MongoTemplate的各種條件查詢示例詳解
這篇文章主要介紹了SpringBoot中的MongoTemplate的各種條件查詢示例詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借價(jià)值,需要的朋友參考下吧2024-01-01
線程池之exectue與submit的區(qū)別及說(shuō)明
這篇文章主要介紹了線程池之exectue與submit的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Springboot整合Swagger2和Swagger3全過(guò)程
這篇文章主要介紹了Springboot整合Swagger2和Swagger3全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
mybatis 如何返回list<String>類型數(shù)據(jù)
這篇文章主要介紹了mybatis 如何返回list<String>類型數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

