您的位置:首页 > 编程语言 > Java开发

(40)21.4.1 装饰性花园---Java编程思想之并发笔记

2012-12-31 15:49 423 查看
1. 问题的提出:
仿真程序,花园委员会希望了解每天通过多个大门进入公园的总人数。每个大门都有一个计数器,并且每个十字转门的计数值递增时,就表示公园中的总人数的共享计数值也会递增。

2.例1
[align=left]package jiangning.c21;[/align]

[align=left]import java.util.ArrayList;[/align]
[align=left]import java.util.List;[/align]
[align=left]import java.util.Random;[/align]
[align=left]import java.util.concurrent.ExecutorService;[/align]
[align=left]import java.util.concurrent.Executors;[/align]
[align=left]import java.util.concurrent.TimeUnit;[/align]

[align=left]class Count{//计数器[/align]
private int count =
0;
[align=left] private Random rand = new Random(47); //引入rand的目的是在重count读取到 temp中,[/align]
[align=left]// 到 temp递增并把temp存回到count中留出大概一半的时间,如果将increment方法的[/align]
[align=left]// synchronized关键字注释掉,这个程序将会崩溃,多个任务同时访问并修改count。[/align]
[align=left] public synchronized int increment(){//增加人员,同步用来控制count域的访问[/align]
[align=left]// 如果移除synchronized将会发现count和number不符。[/align]
int temp
= count ;
[align=left] if(rand .nextBoolean()){[/align]
[align=left] Thread. yield();[/align]
[align=left] }[/align]
return (count =
++temp);
[align=left] }[/align]
[align=left] public synchronized int value(){//同步用来控制count域的访问[/align]
[align=left] return count ;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]class Entrance implements Runnable{[/align]
[align=left] private static Count count = new Count();[/align]
[align=left] private static List<Entrance> entrances = new ArrayList<Entrance>();[/align]
private int number =
0;
[align=left] private final int id;[/align]
[align=left] private static volatile boolean canceled = false ;//因为canceled被定义为volatile,[/align]
[align=left]// boolean标记,它只会被读取和赋值,所以不需要同步,就可以安全的访问。在开发中对这样的[/align]
[align=left]// 域有疑问,那么就用synchronized。[/align]
[align=left] public static void cancel(){[/align]
[align=left] canceled = true ;[/align]
[align=left] }[/align]
public Entrance
(int id){
this.id =
id;
[align=left] entrances.add(this );[/align]
[align=left] }[/align]
[align=left] public void run(){[/align]
[align=left] while(!canceled ){//在run方法中使得number值进行递增。每个Entrance对象维护一个number[/align]
[align=left] synchronized(this ){[/align]
[align=left] ++ number;[/align]
[align=left] }[/align]
System. out.println(this + "
Total " + count.increment());//在run方法count值进行递增。
[align=left] try {[/align]
[align=left] TimeUnit. MILLISECONDS.sleep(100);[/align]
} catch (InterruptedException
e) {
System. out.println("sleep
interrupted" );
[align=left] }[/align]
[align=left] }[/align]
System. out.println("Stopping
" + this);
[align=left] }[/align]
[align=left] public synchronized int getValue(){[/align]
[align=left] return number ;[/align]
[align=left] }[/align]
public String
toString(){
return "Entance
" + id + ":
" + getValue();
[align=left] }[/align]
[align=left] public static int getTotalCount(){[/align]
[align=left] return count .value();[/align]
[align=left] }[/align]
[align=left] public static int sumEntrance(){[/align]
int sum
= 0;
for(Entrance
e : entrances){
[align=left] sum = sum + e.getValue();[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left] }[/align]
[align=left]}[/align]
public class OrnamentalGarden
{

public static void main(String[]
args) throws Exception{
[align=left] ExecutorService exec = Executors. newCachedThreadPool();[/align]
for(int i=0;
i<5; i++){
[align=left] exec.execute( new Entrance(i));[/align]
[align=left] }[/align]
[align=left] TimeUnit. SECONDS.sleep(3);//暂停3秒[/align]
[align=left] Entrance. cancel();//将canceled设置为true[/align]
[align=left] exec.shutdown(); //关闭线程。[/align]
if(!exec.awaitTermination(250,
TimeUnit.MICROSECONDS)){ //等待每个任务结束
[align=left]// 如果所有的任务在超时时间之前结束,则返回true,否则返回false,表示不是说有的任[/align]
[align=left]// 务已经结束。[/align]
System. out.println("Some
task were not terminated!" );
[align=left] }[/align]
System. out.println("Total:
" + Entrance.getTotalCount ());
System. out.println("Sum
of Entrance : " + Entrance.sumEntrance());
[align=left] }[/align]
[align=left]}[/align]

[align=left]/**[/align]
[align=left] * Entance 1: 1 Total 2[/align]
[align=left]Entance 4: 1 Total 5[/align]
[align=left]Entance 2: 1 Total 3[/align]
[align=left]Entance 3: 1 Total 4[/align]
[align=left]Entance 0: 1 Total 1[/align]
[align=left]Entance 1: 2 Total 6[/align]
[align=left]Entance 0: 2 Total 10[/align]
[align=left]Entance 2: 2 Total 9[/align]
[align=left]Entance 4: 2 Total 7[/align]
[align=left]Entance 3: 2 Total 8[/align]
[align=left]Entance 2: 3 Total 11[/align]
[align=left]Entance 0: 3 Total 15[/align]
[align=left]Entance 1: 3 Total 13[/align]
[align=left]Entance 3: 3 Total 14[/align]
[align=left]Entance 4: 3 Total 12[/align]
[align=left]Entance 1: 4 Total 16[/align]
[align=left]Entance 0: 4 Total 20[/align]
[align=left]Entance 3: 4 Total 19[/align]
[align=left]Entance 4: 4 Total 17[/align]
[align=left]Entance 2: 4 Total 18[/align]
[align=left]Entance 1: 5 Total 21[/align]
[align=left]Entance 2: 5 Total 25[/align]
[align=left]Entance 0: 5 Total 23[/align]
[align=left]Entance 4: 5 Total 24[/align]
[align=left]Entance 3: 5 Total 22[/align]
[align=left]Entance 3: 6 Total 26[/align]
[align=left]Entance 1: 6 Total 27[/align]
[align=left]Entance 0: 6 Total 29[/align]
[align=left]Entance 2: 6 Total 28[/align]
[align=left]Entance 4: 6 Total 30[/align]
[align=left]Entance 1: 7 Total 31[/align]
[align=left]Entance 2: 7 Total 35[/align]
[align=left]Entance 4: 7 Total 34[/align]
[align=left]Entance 3: 7 Total 33[/align]
[align=left]Entance 0: 7 Total 32[/align]
[align=left]Entance 1: 8 Total 36[/align]
[align=left]Entance 4: 8 Total 40[/align]
[align=left]Entance 2: 8 Total 38[/align]
[align=left]Entance 3: 8 Total 37[/align]
[align=left]Entance 0: 8 Total 39[/align]
[align=left]Entance 2: 9 Total 41[/align]
[align=left]Entance 3: 9 Total 42[/align]
[align=left]Entance 0: 9 Total 43[/align]
[align=left]Entance 4: 9 Total 44[/align]
[align=left]Entance 1: 9 Total 45[/align]
[align=left]Entance 1: 10 Total 46[/align]
[align=left]Entance 3: 10 Total 50[/align]
[align=left]Entance 0: 10 Total 47[/align]
[align=left]Entance 2: 10 Total 49[/align]
[align=left]Entance 4: 10 Total 48[/align]
[align=left]Entance 3: 11 Total 51[/align]
[align=left]Entance 2: 11 Total 55[/align]
[align=left]Entance 1: 11 Total 54[/align]
[align=left]Entance 4: 11 Total 52[/align]
[align=left]Entance 0: 11 Total 53[/align]
[align=left]Entance 4: 12 Total 56[/align]
[align=left]Entance 1: 12 Total 60[/align]
[align=left]Entance 2: 12 Total 59[/align]
[align=left]Entance 0: 12 Total 57[/align]
[align=left]Entance 3: 12 Total 58[/align]
[align=left]Entance 3: 13 Total 61[/align]
[align=left]Entance 1: 13 Total 65[/align]
[align=left]Entance 2: 13 Total 63[/align]
[align=left]Entance 4: 13 Total 62[/align]
[align=left]Entance 0: 13 Total 64[/align]
[align=left]Entance 0: 14 Total 66[/align]
[align=left]Entance 4: 14 Total 70[/align]
[align=left]Entance 2: 14 Total 69[/align]
[align=left]Entance 1: 14 Total 68[/align]
[align=left]Entance 3: 14 Total 67[/align]
[align=left]Entance 4: 15 Total 71[/align]
[align=left]Entance 3: 15 Total 72[/align]
[align=left]Entance 1: 15 Total 73[/align]
[align=left]Entance 0: 15 Total 75[/align]
[align=left]Entance 2: 15 Total 74[/align]
[align=left]Entance 0: 16 Total 76[/align]
[align=left]Entance 3: 16 Total 80[/align]
[align=left]Entance 2: 16 Total 79[/align]
[align=left]Entance 4: 16 Total 77[/align]
[align=left]Entance 1: 16 Total 78[/align]
[align=left]Entance 3: 17 Total 81[/align]
[align=left]Entance 2: 17 Total 84[/align]
[align=left]Entance 1: 17 Total 85[/align]
[align=left]Entance 0: 17 Total 83[/align]
[align=left]Entance 4: 17 Total 82[/align]
[align=left]Entance 0: 18 Total 86[/align]
[align=left]Entance 3: 18 Total 88[/align]
[align=left]Entance 1: 18 Total 90[/align]
[align=left]Entance 4: 18 Total 87[/align]
[align=left]Entance 2: 18 Total 89[/align]
[align=left]Entance 4: 19 Total 91[/align]
[align=left]Entance 2: 19 Total 92[/align]
[align=left]Entance 1: 19 Total 93[/align]
[align=left]Entance 3: 19 Total 95[/align]
[align=left]Entance 0: 19 Total 94[/align]
[align=left]Entance 2: 20 Total 96[/align]
[align=left]Entance 3: 20 Total 97[/align]
[align=left]Entance 4: 20 Total 100[/align]
[align=left]Entance 0: 20 Total 99[/align]
[align=left]Entance 1: 20 Total 98[/align]
[align=left]Entance 1: 21 Total 101[/align]
[align=left]Entance 4: 21 Total 105[/align]
[align=left]Entance 2: 21 Total 104[/align]
[align=left]Entance 0: 21 Total 103[/align]
[align=left]Entance 3: 21 Total 102[/align]
[align=left]Entance 1: 22 Total 106[/align]
[align=left]Entance 4: 22 Total 110[/align]
[align=left]Entance 0: 22 Total 109[/align]
[align=left]Entance 2: 22 Total 108[/align]
[align=left]Entance 3: 22 Total 107[/align]
[align=left]Entance 1: 23 Total 111[/align]
[align=left]Entance 3: 23 Total 115[/align]
[align=left]Entance 2: 23 Total 114[/align]
[align=left]Entance 0: 23 Total 113[/align]
[align=left]Entance 4: 23 Total 112[/align]
[align=left]Entance 3: 24 Total 116[/align]
[align=left]Entance 2: 24 Total 117[/align]
[align=left]Entance 0: 24 Total 120[/align]
[align=left]Entance 1: 24 Total 119[/align]
[align=left]Entance 4: 24 Total 118[/align]
[align=left]Entance 1: 25 Total 121[/align]
[align=left]Entance 4: 25 Total 125[/align]
[align=left]Entance 2: 25 Total 124[/align]
[align=left]Entance 0: 25 Total 123[/align]
[align=left]Entance 3: 25 Total 122[/align]
[align=left]Entance 1: 26 Total 126[/align]
[align=left]Entance 2: 26 Total 127[/align]
[align=left]Entance 4: 26 Total 130[/align]
[align=left]Entance 3: 26 Total 128[/align]
[align=left]Entance 0: 26 Total 129[/align]
[align=left]Entance 1: 27 Total 131[/align]
[align=left]Entance 4: 27 Total 132[/align]
[align=left]Entance 3: 27 Total 133[/align]
[align=left]Entance 2: 27 Total 134[/align]
[align=left]Entance 0: 27 Total 135[/align]
[align=left]Entance 4: 28 Total 136[/align]
[align=left]Entance 2: 28 Total 139[/align]
[align=left]Entance 0: 28 Total 138[/align]
[align=left]Entance 3: 28 Total 137[/align]
[align=left]Entance 1: 28 Total 140[/align]
[align=left]Entance 0: 29 Total 141[/align]
[align=left]Entance 2: 29 Total 145[/align]
[align=left]Entance 4: 29 Total 144[/align]
[align=left]Entance 3: 29 Total 143[/align]
[align=left]Entance 1: 29 Total 142[/align]
[align=left]Entance 4: 30 Total 146[/align]
[align=left]Entance 3: 30 Total 150[/align]
[align=left]Entance 2: 30 Total 149[/align]
[align=left]Entance 0: 30 Total 147[/align]
[align=left]Entance 1: 30 Total 148[/align]
[align=left]Some task were not terminated![/align]
[align=left]Total: 150[/align]
[align=left]Sum of Entrance : 150[/align]
[align=left]Stopping Entance 3: 30[/align]
[align=left]Stopping Entance 2: 30[/align]
[align=left]Stopping Entance 0: 30[/align]
[align=left]Stopping Entance 1: 30[/align]
[align=left]Stopping Entance 4: 30[/align]
[align=left]*/[/align]

[align=left]在复审并发代码时,要格外小心。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: