package exercise.exercise19;
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;
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 canceld(){
// canceled =true;
// }
public Entrance(int id) {
this.id = id;
entrances.add(this);
}
@Override
public void run() {
// while (!canceled) {
try {
while (true) {
synchronized (this) {
++number;
}
print(this + " Total:" + count.increment());
TimeUnit.MILLISECONDS.sleep(100);
}
} catch (InterruptedException e) {
print("sleep interrupted");
}
print("stop " + this);
}
public synchronized int getValue() {
return number++;
}
@Override
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) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
exec.execute(new Entrance(i));
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
}
// Entrance.canceld();
// exec.shutdown();
exec.shutdownNow();
try {
if (!exec.awaitTermination(250, TimeUnit.MILLISECONDS)) {
print("Some tasks were not terminated!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
print("Total: " + Entrance.getTotalCount());
print("Sum of Entrances:" + Entrance.sumEntrances());
}
}
注释掉之前的cancel标记即可。把关闭的ExecutorService的方法改为shutdownNow即可。
JAVA编程思想第四版-多线程的练习答案之练习19
最新推荐文章于 2020-05-16 00:33:41 发布
