Доброго времени суток, странное дело происходит с этой задачей. Реализовывал несколькими способами, но валидатор в итоге принял вариант, в котором вывод правильный но после вывода нити продолжают работать и программа не завершается. Для примера код Consumer
try {
            Thread.sleep(450);
        }
        catch (InterruptedException e) { }
        while (!Thread.currentThread().isInterrupted()) {
            ShareItem item = null;
            try {
                item = queue.take();
                System.out.format("Processing %s\n", item.toString());
            }
            catch (InterruptedException e) { }
        }