Code Review

Concurrency: thread synchronization

?

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());
        }
    }
}