Thinking in Java : OrnamentalGarden

来源:互联网 发布:小甲鱼java百度云 编辑:程序博客网 时间:2024/06/07 08:02

count类用于计数,其中的increment()和value()为synchronized,控制对于count域的安全访问。

Entrance类需要注意的是其中的count,entrances和canceled域均为static,因此为所有对象共有。

main中将canceled设置为false,所有对象将会判断出取消,然后终止。

其他线程运行时,main进程等待3秒,因为每次运行100ms,所以每个线程可以通过30次,所以总共计数为150.

import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;class Count {private int count = 0;private Random rand = new Random(47);public synchronized int increment() {int temp = count;if(rand.nextBoolean())Thread.yield();return (count = ++temp);}public synchronized int value() {return count;}}class Entrance implements Runnable {private static Count count = new Count();//整个entrance类公用的计数private static List<Entrance> entrances = new ArrayList<Entrance>();private int number = 0;//每一个entrance所纪录的人数private final int id;private static volatile boolean canceled = false;public static void cancel() {canceled = true;}public Entrance(int id) {this.id = id;entrances.add(this);}public void run() {while(!canceled) {synchronized(this) {++number;}System.out.println(this + "Total: " + count.increment());try {TimeUnit.MILLISECONDS.sleep(100);} catch(InterruptedException e) {System.out.println("sleep interrupted");}}System.out.println("stopping " + this);}public synchronized int getValue() {return number;}public String toString() { return "Entrance " + id + ": " + getValue();}public static int getTotalCount() { return count.value();}public static int sumEntrances() {int sum =0;for(Entrance entrance : entrances)sum += entrance.getValue();return sum;}}public class OrnamentalGarden {public static void main(String[] args) throws InterruptedException {ExecutorService exec = Executors.newCachedThreadPool();for(int i = 0; i < 5; i++)exec.execute(new Entrance(i));TimeUnit.SECONDS.sleep(3);Entrance.cancel();//close certain entranceexec.shutdown();if(!exec.awaitTermination(250, TimeUnit.MILLISECONDS))System.out.println("Some tasks were not terminated");System.out.println("Total: " + Entrance.getTotalCount());System.out.println("Sum of Entrance: " + Entrance.sumEntrances());}}
</pre><pre name="code" class="java">
<pre name="code" class="java">Entrance 0: 1Total: 1Entrance 4: 1Total: 5Entrance 3: 1Total: 4Entrance 1: 1Total: 3Entrance 2: 1Total: 2Entrance 0: 2Total: 6Entrance 2: 2Total: 8Entrance 1: 2Total: 7Entrance 3: 2Total: 9Entrance 4: 2Total: 10Entrance 2: 3Total: 11Entrance 1: 3Total: 12Entrance 0: 3Total: 13Entrance 4: 3Total: 14Entrance 3: 3Total: 15Entrance 2: 4Total: 16Entrance 0: 4Total: 18Entrance 1: 4Total: 17Entrance 4: 4Total: 19Entrance 3: 4Total: 20Entrance 2: 5Total: 21Entrance 0: 5Total: 22Entrance 1: 5Total: 23Entrance 4: 5Total: 24Entrance 3: 5Total: 25Entrance 1: 6Total: 27Entrance 0: 6Total: 30Entrance 2: 6Total: 26Entrance 3: 6Total: 29Entrance 4: 6Total: 28Entrance 3: 7Total: 31Entrance 0: 7Total: 35Entrance 2: 7Total: 34Entrance 1: 7Total: 33Entrance 4: 7Total: 32Entrance 0: 8Total: 36Entrance 1: 8Total: 40Entrance 2: 8Total: 39Entrance 3: 8Total: 38Entrance 4: 8Total: 37Entrance 1: 9Total: 41Entrance 3: 9Total: 43Entrance 0: 9Total: 42Entrance 4: 9Total: 44Entrance 2: 9Total: 45Entrance 3: 10Total: 46Entrance 0: 10Total: 48Entrance 1: 10Total: 47Entrance 4: 10Total: 50Entrance 2: 10Total: 49Entrance 1: 11Total: 51Entrance 2: 11Total: 52Entrance 3: 11Total: 53Entrance 0: 11Total: 54Entrance 4: 11Total: 55Entrance 2: 12Total: 56Entrance 0: 12Total: 59Entrance 3: 12Total: 58Entrance 1: 12Total: 57Entrance 4: 12Total: 60Entrance 2: 13Total: 61Entrance 1: 13Total: 63Entrance 0: 13Total: 62Entrance 4: 13Total: 65Entrance 3: 13Total: 64Entrance 1: 14Total: 66Entrance 4: 14Total: 67Entrance 3: 14Total: 68Entrance 2: 14Total: 70Entrance 0: 14Total: 69Entrance 2: 15Total: 72Entrance 1: 15Total: 75Entrance 0: 15Total: 74Entrance 4: 15Total: 73Entrance 3: 15Total: 71Entrance 1: 16Total: 76Entrance 0: 16Total: 78Entrance 4: 16Total: 77Entrance 2: 16Total: 80Entrance 3: 16Total: 79Entrance 0: 17Total: 81Entrance 4: 17Total: 82Entrance 2: 17Total: 83Entrance 1: 17Total: 84Entrance 3: 17Total: 85Entrance 0: 18Total: 86Entrance 3: 18Total: 87Entrance 2: 18Total: 88Entrance 4: 18Total: 90Entrance 1: 18Total: 89Entrance 2: 19Total: 91Entrance 0: 19Total: 92Entrance 3: 19Total: 94Entrance 4: 19Total: 93Entrance 1: 19Total: 95Entrance 0: 20Total: 96Entrance 3: 20Total: 98Entrance 1: 20Total: 97Entrance 4: 20Total: 100Entrance 2: 20Total: 99Entrance 4: 21Total: 101Entrance 3: 21Total: 105Entrance 1: 21Total: 104Entrance 2: 21Total: 103Entrance 0: 21Total: 102Entrance 4: 22Total: 106Entrance 3: 22Total: 110Entrance 2: 22Total: 109Entrance 1: 22Total: 107Entrance 0: 22Total: 108Entrance 2: 23Total: 111Entrance 0: 23Total: 113Entrance 3: 23Total: 112Entrance 1: 23Total: 115Entrance 4: 23Total: 114Entrance 1: 24Total: 116Entrance 2: 24Total: 118Entrance 3: 24Total: 117Entrance 0: 24Total: 119Entrance 4: 24Total: 120Entrance 2: 25Total: 121Entrance 1: 25Total: 122Entrance 4: 25Total: 124Entrance 3: 25Total: 123Entrance 0: 25Total: 125Entrance 1: 26Total: 126Entrance 2: 26Total: 127Entrance 4: 26Total: 128Entrance 0: 26Total: 129Entrance 3: 26Total: 130Entrance 1: 27Total: 131Entrance 0: 27Total: 133Entrance 4: 27Total: 132Entrance 2: 27Total: 134Entrance 3: 27Total: 135Entrance 0: 28Total: 136Entrance 4: 28Total: 138Entrance 2: 28Total: 137Entrance 3: 28Total: 140Entrance 1: 28Total: 139Entrance 0: 29Total: 141Entrance 2: 29Total: 142Entrance 4: 29Total: 143Entrance 3: 29Total: 144Entrance 1: 29Total: 145Entrance 4: 30Total: 146Entrance 0: 30Total: 149Entrance 3: 30Total: 148Entrance 2: 30Total: 147Entrance 1: 30Total: 150stopping Entrance 0: 30stopping Entrance 3: 30stopping Entrance 1: 30stopping Entrance 2: 30stopping Entrance 4: 30Total: 150Sum of Entrance: 150



0 0
原创粉丝点击