本文實例講述了java多線程解決生產(chǎn)者消費者問題的方法。分享給大家供大家參考。具體分析如下:
題目是這樣的:
采用Java 多線程技術(shù),設(shè)計實現(xiàn)一個符合生產(chǎn)者和消費者問題的程序。對一個對象(槍膛)進行操作,其最大容量是12顆子彈。生產(chǎn)者線程是一個壓入線程,它不斷向槍膛中壓入子彈;消費者線程是一個射出線程,它不斷從槍膛中射出子彈。
要求:
(1)給出分析過程說明。
(2)程序輸出,要模擬體現(xiàn)對槍膛的壓入和射出操作;
(2)設(shè)計程序時應(yīng)考慮到兩個線程的同步問題。
這個和著名的生產(chǎn)者消費者問題幾乎是一樣的,這里做一下簡單分析。
還是直接用代碼說話吧,注釋寫的很明白
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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(); } } /* 首先我要有一個彈夾,*/ class GunClip //彈夾 { private List<Integer> list= null ; //用來放子彈 private boolean bFull = false ; //理解boolean變量很重要,表示滿沒滿 //函數(shù)功能,像彈夾中放子彈 public synchronized void put(List list){ if (!bFull){ //意思是說彈夾沒有滿,那么就像里面放子彈 this .list=list; bFull= true ; //放滿了子彈,在把boolean變量變?yōu)閠rue表示,彈夾滿了 notify(); //通知,等待取子彈的線程來取子彈 } //下面的try中得wait是當(dāng)彈夾滿了的情況下, //即boolean為true,暫停本線程,等待取子彈 try { wait(); } catch (Exception e){ e.printStackTrace(); } } public synchronized void get(){ if (!bFull){ //如果彈夾沒滿那么就不能取子彈 try { wait(); //彈夾沒滿,所以取不了,只能等待,只有彈夾滿了才能取 } catch (Exception e){ e.printStackTrace(); } } //下面是彈夾滿了,那么我開始取子彈 System.out.println( "\n" + "機槍開始射出子彈:" + "\n" ); for ( int i=list.size();i> 0 ;i--){ int j=(Integer)list.get(i- 1 ); System.out.println( "已射出第" +j+ "顆子彈" ); } //彈夾被取空了,即沒子彈了,那么只能等待重新填充, //所以boolean變?yōu)閒alse,表示沒滿,通知裝子彈的線程裝子彈 bFull= false ; notify(); } } //生產(chǎn)者,即裝子彈,下面和公告板差不多,要有一個彈夾的實體 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個彈夾 list= new ArrayList(); System.out.println( "\n" + "機槍開始壓入子彈:" + "\n" ); for ( int j= 0 ;j< 12 ;j++){ list.add(j+ 1 ); System.out.println( "已壓入第" +(j+ 1 )+ "顆子彈" ); } clip.put(list); } } } //消費者,發(fā)射子彈 class Concumer extends Thread { private GunClip clip; Concumer(GunClip clip){ this .clip=clip; } public void run(){ while ( true ){ clip.get(); } } } |
希望本文所述對大家的java程序設(shè)計有所幫助。