task30.task3003

Все требования задания, как всегда, учтены, вывод информации совпадает с образцом, на задача не принимается, в чем может быть проблема?

Условие:
1. Создай Producer и Consumer (См. комментарий к методу main).
2. Создай методы toString, equals и hashCode в классе ShareItem. Для этого в IntelliJ IDEA в теле класса ShareItem выполни:
2.1. Alt+Enter -> toString() -> Enter.
2.2. Alt+Enter -> equals() and hashCode() -> click all ‘Next’-s.
2.3. Реализацию методов toString(), equals() и hashCode() оставь такими, какими их сгенерировала IntelliJ IDEA.
3. В Producer и Consumer реализуй метод run так, чтобы вызов метода interrupt прерывал работу consumer и producer трэдов.
4. Реализация метода run для Producer:
4.1. Используя метод offer добавь в очередь 9 ShareItem-ов с такими параметрами: («ShareItem-N«, N), где N — номер элемента от 1 до 9.
4.2. Перед каждым добавлением выведи фразу «Элемент ‘ShareItem-N‘ добавлен«. Используй System.out.format.
4.3. Усыпи трэд на 0.1 секунды.
4.4. Если у очереди есть Consumer, не занятый работой, то выведи фразу «Consumer в ожидании!«.
Просмотри методы интерфейса TransferQueue, там есть нужный метод.
5. Реализация метода run для Consumer:
5.1. Усыпи трэд на 0.45 секунды.
5.2. В бесконечном цикле забери элемент из очереди методом take и выведи в консоль «Processing item.toString()«.
6. Сверь вывод с файлом output.txt.
7. Стек-трейс не выводи в консоль.
8. Для вывода любой информации на экран используй System.out.format.

output.txt:
Элемент 'ShareItem-1' добавлен
Элемент 'ShareItem-2' добавлен
Элемент 'ShareItem-3' добавлен
Элемент 'ShareItem-4' добавлен
Элемент 'ShareItem-5' добавлен
Processing ShareItem{description='ShareItem-1', itemId=1}
Processing ShareItem{description='ShareItem-2', itemId=2}
Processing ShareItem{description='ShareItem-3', itemId=3}
Processing ShareItem{description='ShareItem-4', itemId=4}
Processing ShareItem{description='ShareItem-5', itemId=5}
Consumer в ожидании!
Элемент 'ShareItem-6' добавлен
Processing ShareItem{description='ShareItem-6', itemId=6}
Consumer в ожидании!
Элемент 'ShareItem-7' добавлен
Processing ShareItem{description='ShareItem-7', itemId=7}
Consumer в ожидании!
Элемент 'ShareItem-8' добавлен
Processing ShareItem{description='ShareItem-8', itemId=8}
Consumer в ожидании!
Элемент 'ShareItem-9' добавлен
Processing ShareItem{description='ShareItem-9', itemId=9}
Consumer в ожидании!

Solution:
public class Solution {
    /*
    1. Создай класс Producer. Для этого на красном имени класса нажми Alt+Enter -> Create Class ...
    2. Стань на имени аргумента в конструкторе (queue) и нажми Alt+Enter -> Create Field for Parameter 'queue' -> Enter -> Enter. Имя поля - queue.
    3. Стань на подчеркнутой строке - описании класса. Далее Alt+Enter -> Implement Methods -> Enter.
    4. Проделай п.1-3 для класса Consumer.
     */

    public static void main(String[] args) throws InterruptedException {
        TransferQueue<ShareItem> queue = new LinkedTransferQueue<>();

        Thread producer = new Thread(new Producer(queue));
        Thread consumer = new Thread(new Consumer(queue));
        producer.start();
        consumer.start();

        Thread.sleep(1500);

        producer.interrupt();
        consumer.interrupt();
    }
}


ShareItem:
public class ShareItem {
    public String description;
    public int itemId;

    public ShareItem() {
        this("Test Item", 0);
    }

    public ShareItem(String description) {
        this(description, 0);
    }

    public ShareItem(int itemId) {
        this("Test Item", itemId);
    }

    public ShareItem(String description, int itemId) {
        this.description = description;
        this.itemId = itemId;
    }

    public String getDescription() {
        return description;
    }

    public int getItemId() {
        return itemId;
    }

    @Override
    public String toString() {
        return "ShareItem{" +
                "description='" + description + '\'' +
                ", itemId=" + itemId +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ShareItem shareItem = (ShareItem) o;

        if (itemId != shareItem.itemId) return false;
        return description != null ? description.equals(shareItem.description) : shareItem.description == null;
    }

    @Override
    public int hashCode() {
        int result = description != null ? description.hashCode() : 0;
        result = 31 * result + itemId;
        return result;
    }
}


Producer:
public class Producer implements Runnable
{
    private TransferQueue<ShareItem> queue;

    public Producer(TransferQueue<ShareItem> queue)
    {
        this.queue = queue;
    }

    @Override
    public void run()
    {
        try
        {
            for (int i = 1; i <= 9; i++)
            {
                ShareItem shareItem = new ShareItem("ShareItem-" + i, i);
                System.out.format("Элемент '%s' добавлен\n", shareItem.getDescription());
                queue.offer(shareItem);

                Thread.sleep(100);

                if (queue.hasWaitingConsumer()) {
                    System.out.format("Consumer в ожидании!\n");
                }
            }
        }
        catch (InterruptedException ignore)
        {
        }
    }
}


Consumer:
public class Consumer implements Runnable
{
    private TransferQueue<ShareItem> queue;

    public Consumer(TransferQueue<ShareItem> queue)
    {
        this.queue = queue;
    }

    @Override
    public void run()
    {
        try
        {
            Thread.sleep(450);
            while (true)
            {
                System.out.format("Processing " + queue.take().toString() + "\n");
            }
        }
        catch (InterruptedException ignore)
        {
        }
    }
}