#536 Потокобезопасный шедулер callback-ов

Компании:
Яндекс
Темы:
JavaМногопоточностьПрактика

Даны тест и интерфейс, нужно заимплементировать шедулер, чтобы он был потокобезопасный. Executors для этого использовать нельзя.

package ru.artem.papyan.yahello.util;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import ru.artem.papyan.yahello.util.impl.CallbackSchedulerImpl;

import java.time.Instant;

import static org.junit.jupiter.api.Assertions.assertTrue;

class CallbackSchedulerTest {

    private CallbackScheduler scheduler;

    private static class CallbackResult {
        boolean isDone = false;
    }

    @BeforeEach
    void setUp() {
        scheduler = new CallbackSchedulerImpl();
    }

    @AfterEach
    void tearDown() throws Exception {
        scheduler.close();
    }

    @Test
    void testSimple() throws InterruptedException {
        final CallbackResult result = new CallbackResult();

        scheduler.schedule(
                () -> {
                    synchronized (result) {
                        result.isDone = true;
                        result.notify();
                    }
                },
                Instant.now().plusSeconds(2)
        );

        synchronized (result) {
            result.wait();
            assertTrue(result.isDone);
        }
    }
}
package ru.artem.papyan.yahello.util;

import java.time.Instant;

public interface CallbackScheduler extends AutoCloseable {
    void schedule(Runnable callback, Instant when);
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти