public class Store {
private final Logger logger = Logger.getLogger(Store.class.getName());
private final Queue<Integer> numbers = new LinkedList<>();
private final Random rnd = new Random();
public synchronized void produce() {
public class Store {
private final Logger logger = Logger.getLogger(Store.class.getName());
private final Queue<Integer> numbers = new LinkedList<>();
private final Random rnd = new Random();
public synchronized void produce() {
public class Store {
private final Queue<Integer> numbers = new LinkedList<>();
//...
public synchronized void produce() {
//...
}
public synchronized void consume() {
//...
}
public Queue<Integer> getNumbers() {
return numbers;
}
}
public synchronized void produce() {
while (numbers.size() >= 10) {
logger.info(Thread.currentThread().getName() + ", store is full!");
try {
wait();
} catch (InterruptedException e) {
logger.severe(e.getMessage());
}
}
int addedNumber = rnd.nextInt(100);
numbers.offer(addedNumber);
logger.info(Thread.currentThread().getName() + " number " + addedNumber + " was added.");
logger.info("Store size is " + numbers.size());
notify();
}
public class ProducerThread implements Runnable {
private final Store store;
public ProducerThread(Store store) {
this.store = store;
}
public void run() {
for (int i = 1; i <= 10; i++) {
store.produce();
}
}
}
public class FactoryThread extends Thread {
private Factory factory;
public FactoryThread(Factory factory) {
this.factory = factory;
}
public void run() {
while (factory.getDaysTerm() > 0) {
factory.create();
}
}
}
public class Factory {
private final Logger logger = Logger.getLogger(Factory.class.getName());
private boolean dayTime;
private int daysTerm;
private final Queue<String> repository = new LinkedList<>();
private final Random random = new Random();
public Factory(int daysTerm) {
this.daysTerm = daysTerm;
dayTime = true;
}
public synchronized void create() {
public synchronized void create() {
while (!dayTime) {
try {
wait();
} catch (InterruptedException e) {
logger.severe(e.getMessage());
}
}
for (int i = 1; i <= 10; i++) {
int detailNumber = random.nextInt(4);
String getDetail = "";
switch (detailNumber) {
case 0:
getDetail = "head";
break;
case 1:
getDetail = "torso";
break;
case 2:
getDetail = "hand";
break;
case 3:
getDetail = "feet";
break;
}
repository.add(getDetail);
logger.info(Thread.currentThread().getName() + " " + getDetail + " was created");
}
if (repository.size() == 10) {
dayTime = false;
logger.info("The night has begun");
daysTerm--;
notifyAll();
}
}
public class World extends Fraction implements Runnable {
private final Logger logger = Logger.getLogger(World.class.getName());
public World(Factory factory) {
super(factory);
}
public void run() {
while (getFactory().getDaysTerm() > 0) {
obtainDetails();
createRobot();
}
logger.info("World has " + getRobotsAry() + " robots.");
}
}
public class Wednesday extends Fraction implements Runnable {
private final Logger logger = Logger.getLogger(Wednesday.class.getName());
public Wednesday(Factory factory) {
super(factory);
}
public void run() {
while (getFactory().getDaysTerm() > 0) {
obtainDetails();
createRobot();
}
logger.info("Wednesday has " + getRobotsAry() + " robots.");
}
}
public void createRobot() {
if (robotDetails.get("head") >= 1 && robotDetails.get("torso") >= 1 && robotDetails.get("hand") >= 1 && robotDetails.get("feet") >= 1) {
robotsAry++;
robotDetails.replace("head", robotDetails.get("head") - 1);
robotDetails.replace("torso", robotDetails.get("torso") - 1);
robotDetails.replace("hand", robotDetails.get("hand") - 1);
robotDetails.replace("feet", robotDetails.get("feet") - 1);
logger.info(Thread.currentThread().getName() + " one robot was created");
}
}
public class Fraction {
private final Factory factory;
//...
public Fraction(Factory factory) {
this.factory = factory;
//...
}
public void obtainDetails() {
//...
}
public class Factory {
private static final Logger logger = Logger.getLogger(Factory.class.getName());
private List<String> details;
public Factory(List<String> details) {
this.details = details;
}
public void dayInSkyNet(Producer producer, Wednesday wednesday, World world, int days) {
for (int i = 1; i <= days; i++) {
Thread producerThread = new Thread(producer, "Producer");
producerThread.start();
try {
producerThread.join();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
Thread worldThread = new Thread(world, "World");
Thread wednesdayThread = new Thread(wednesday, "Wednesday");
worldThread.start();
wednesdayThread.start();
try {
worldThread.join();
wednesdayThread.join();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}