class Toast {
public enum Status {
DRY, BUTTERED, JAMMED
}
private Status status = Status.DRY;
private final int id;
public Toast(int idn) {
id = idn;
}
public void buffer() {
status = Status.BUTTERED;
}
public void jam() {
status = Status.JAMMED;
}
public Status getStatus() {
return status;
}
public int getId() {
return id;
}
public String toString() {
return "Toast " + id +
": " + status;
}
}
class ToastQueue extends LinkedBlockingQueue<Toast> {
}
class Toaster implements Runnable {
private ToastQueue toastQueue;
private int count =
0;
private Random rand =
new Random(
47);
public Toaster(ToastQueue tq) {
toastQueue = tq;
}
public void run() {
try {
while (!Thread.interrupted()) {
TimeUnit.MILLISECONDS.sleep(
100 + rand.nextInt(
500));
Toast t =
new Toast(count++);
print(t);
toastQueue.put(t);
}
}
catch (InterruptedException e) {
print(
"Toaster interrupted");
}
print(
"Toaster off");
}
}
class Butterer implements Runnable {
private ToastQueue dryQueue, butteredQueue;
public Butterer(ToastQueue dry, ToastQueue buttered) {
dryQueue = dry;
butteredQueue = buttered;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = dryQueue.take();
t.buffer();
print(t);
butteredQueue.put(t);
}
}
catch (InterruptedException e) {
print(
"Butterer interrupted");
}
print(
"Butterer off");
}
}
class Jammer implements Runnable {
private ToastQueue butteredQueue, finishedQueue;
public Jammer(ToastQueue buttered, ToastQueue finished) {
butteredQueue = buttered;
finishedQueue = finished;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = butteredQueue.take();
t.jam();
print(t);
finishedQueue.put(t);
}
}
catch (InterruptedException e) {
print(
"Jammer interrupted");
}
print(
"Jammer off");
}
}
class Eater implements Runnable {
private ToastQueue finishedQueue;
private int counter =
0;
public Eater(ToastQueue finished) {
finishedQueue = finished;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = finishedQueue.take();
if (t.getId() != counter++ || t.getStatus() != Toast.Status.JAMMED) {
print(
">>>> Error " + t);
System.
exit(
1);
}
else
print(
"chomp!" + t);
}
}
catch (InterruptedException e) {
print(
"Eater interrupted");
}
print(
"Eater off");
}
}
public class ToastOMatic {
public static void main(String[] args) throws
Exception {
ToastQueue dryQueue =
new ToastQueue(), butteredQueue =
new ToastQueue(), finishedQueue =
new ToastQueue();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(
new Toaster(dryQueue));
exec.execute(
new Butterer(dryQueue, butteredQueue));
exec.execute(
new Jammer(butteredQueue, finishedQueue));
exec.execute(
new Eater(finishedQueue));
TimeUnit.SECONDS.sleep(
5);
exec.shutdownNow();
}
}
转载请注明原文地址: https://ju.6miu.com/read-1201496.html