代码稍有点长,不过靠Java吃饭的高手们,这点代码应该是小菜吧。
import java.util.concurrent.*;
import java.util.*;
import static net.mindview.util.Print.*;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();
private static List<Entrance> entrances =
new ArrayList<Entrance>();
private int number = 0;
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;
}
print(this + " Total: " + count.increment());
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch(InterruptedException e) {
print("sleep interrupted");
}
}
print("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 Exception {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 3; i++)
exec.execute(new Entrance(i));
TimeUnit.SECONDS.sleep(1);
Entrance.cancel();
exec.shutdown();
if(!exec.awaitTermination(250, TimeUnit.MILLISECONDS))
print("Some tasks were not terminated!");
print("Total: " + Entrance.getTotalCount());
print("Sum of Entrances: " + Entrance.sumEntrances());
}
}/*输出:
Entrance 2: 1 Total: 3
Entrance 1: 1 Total: 2
Entrance 0: 1 Total: 1
Entrance 2: 2 Total: 4
Entrance 1: 2 Total: 5
Entrance 0: 2 Total: 6
Entrance 2: 3 Total: 7
Entrance 1: 3 Total: 8
Entrance 0: 3 Total: 9
Entrance 2: 4 Total: 10
Entrance 1: 4 Total: 11
Entrance 0: 4 Total: 12
Entrance 1: 5 Total: 13
Entrance 2: 5 Total: 14
Entrance 0: 5 Total: 15
Entrance 1: 6 Total: 16
Entrance 2: 6 Total: 17
Entrance 0: 6 Total: 18
Entrance 1: 7 Total: 19
Entrance 2: 7 Total: 20
Entrance 0: 7 Total: 21
Entrance 1: 8 Total: 22
Entrance 2: 8 Total: 23
Entrance 0: 8 Total: 24
Entrance 1: 9 Total: 25
Entrance 2: 9 Total: 26
Entrance 0: 9 Total: 27
Entrance 1: 10 Total: 28 //这里明明是28、29、30
Entrance 2: 10 Total: 29
Entrance 0: 10 Total: 30
Stopping Entrance 1: 10 //为什么number的值是相同的,从下面的总计可以看出,number和count应该是相同的才对
Stopping Entrance 2: 10
Stopping Entrance 0: 10
Total: 30
Sum of Entrances: 30*/
import java.util.concurrent.*;
import java.util.*;
import static net.mindview.util.Print.*;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();
private static List<Entrance> entrances =
new ArrayList<Entrance>();
private int number = 0;
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;
}
print(this + " Total: " + count.increment());
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch(InterruptedException e) {
print("sleep interrupted");
}
}
print("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 Exception {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 3; i++)
exec.execute(new Entrance(i));
TimeUnit.SECONDS.sleep(1);
Entrance.cancel();
exec.shutdown();
if(!exec.awaitTermination(250, TimeUnit.MILLISECONDS))
print("Some tasks were not terminated!");
print("Total: " + Entrance.getTotalCount());
print("Sum of Entrances: " + Entrance.sumEntrances());
}
}/*输出:
Entrance 2: 1 Total: 3
Entrance 1: 1 Total: 2
Entrance 0: 1 Total: 1
Entrance 2: 2 Total: 4
Entrance 1: 2 Total: 5
Entrance 0: 2 Total: 6
Entrance 2: 3 Total: 7
Entrance 1: 3 Total: 8
Entrance 0: 3 Total: 9
Entrance 2: 4 Total: 10
Entrance 1: 4 Total: 11
Entrance 0: 4 Total: 12
Entrance 1: 5 Total: 13
Entrance 2: 5 Total: 14
Entrance 0: 5 Total: 15
Entrance 1: 6 Total: 16
Entrance 2: 6 Total: 17
Entrance 0: 6 Total: 18
Entrance 1: 7 Total: 19
Entrance 2: 7 Total: 20
Entrance 0: 7 Total: 21
Entrance 1: 8 Total: 22
Entrance 2: 8 Total: 23
Entrance 0: 8 Total: 24
Entrance 1: 9 Total: 25
Entrance 2: 9 Total: 26
Entrance 0: 9 Total: 27
Entrance 1: 10 Total: 28 //这里明明是28、29、30
Entrance 2: 10 Total: 29
Entrance 0: 10 Total: 30
Stopping Entrance 1: 10 //为什么number的值是相同的,从下面的总计可以看出,number和count应该是相同的才对
Stopping Entrance 2: 10
Stopping Entrance 0: 10
Total: 30
Sum of Entrances: 30*/
Entrance 0: 1 Total: 1
Entrance 1: 1 Total: 2
Entrance 2: 1 Total: 3
Entrance 0: 2 Total: 4
Entrance 1: 2 Total: 5
Entrance 2: 2 Total: 6
Entrance 0: 3 Total: 7
Entrance 1: 3 Total: 8
Entrance 2: 3 Total: 9
Entrance 0: 4 Total: 11
Entrance 2: 4 Total: 10
Entrance 1: 4 Total: 12
Entrance 0: 5 Total: 13
Entrance 1: 5 Total: 14
Entrance 2: 5 Total: 15
Entrance 2: 6 Total: 16
Entrance 1: 6 Total: 18
Entrance 0: 6 Total: 17
Entrance 1: 7 Total: 19
Entrance 2: 7 Total: 20
Entrance 0: 7 Total: 21
Entrance 0: 8 Total: 22
Entrance 2: 8 Total: 23
Entrance 1: 8 Total: 24
Entrance 1: 9 Total: 25
Entrance 2: 9 Total: 26
Entrance 0: 9 Total: 27
Stopping Entrance 0: 9
Stopping Entrance 1: 9
Stopping Entrance 2: 9
Total: 27
Sum of Entrances: 27
Entrance 2: 1 Total: 2
Entrance 0: 1 Total: 1
Entrance 1: 1 Total: 3
Entrance 2: 2 Total: 4
Entrance 0: 2 Total: 5
Entrance 1: 2 Total: 6
Entrance 2: 3 Total: 7
Entrance 0: 3 Total: 8
Entrance 1: 3 Total: 9
Entrance 1: 4 Total: 11
Entrance 2: 4 Total: 10
Entrance 0: 4 Total: 12
Entrance 1: 5 Total: 13
Entrance 2: 5 Total: 14
Entrance 0: 5 Total: 15
Entrance 1: 6 Total: 16
Entrance 2: 6 Total: 18
Entrance 0: 6 Total: 17
Entrance 2: 7 Total: 19
Entrance 0: 7 Total: 20
Entrance 1: 7 Total: 21
Entrance 2: 8 Total: 22
Entrance 0: 8 Total: 23
Entrance 1: 8 Total: 24
Entrance 2: 9 Total: 25
Entrance 0: 9 Total: 26
Stopping Entrance 1: 8
Stopping Entrance 2: 9
Stopping Entrance 0: 9
Total: 26
Sum of Entrances: 26
Entrance 0: 1 Total: 1
Entrance 1: 1 Total: 2
Entrance 2: 1 Total: 3
Entrance 0: 2 Total: 4
Entrance 1: 2 Total: 5
Entrance 2: 2 Total: 6
Entrance 0: 3 Total: 7
Entrance 2: 3 Total: 8
Entrance 1: 3 Total: 9
Entrance 2: 4 Total: 11
Entrance 0: 4 Total: 10
Entrance 1: 4 Total: 12
Entrance 2: 5 Total: 13
Entrance 1: 5 Total: 14
Entrance 0: 5 Total: 15
Entrance 2: 6 Total: 16
Entrance 0: 6 Total: 17
Entrance 1: 6 Total: 18
Entrance 2: 7 Total: 19
Entrance 1: 7 Total: 20
Entrance 0: 7 Total: 21
Entrance 2: 8 Total: 22
Entrance 1: 8 Total: 24
Entrance 0: 8 Total: 25
Entrance 2: 9 Total: 23
Entrance 1: 9 Total: 26
Entrance 2: 10 Total: 28
Entrance 0: 9 Total: 27
Stopping Entrance 1: 9
Stopping Entrance 2: 10
Stopping Entrance 0: 9
Total: 28
Sum of Entrances: 28