← Назад к вопросам

Что такое неблокирующая многозадачность?

3.0 Senior🔥 121 комментариев
#Многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Неблокирующая многозадачность

Неблокирующая многозадачность (non-blocking concurrency) — это модель программирования, при которой операция не приостанавливает поток выполнения в ожидании завершения других операций. Вместо того чтобы заблокировать текущий поток, программа регистрирует обработчик события или коллбэк, который будет вызван, когда результат станет доступен.

Основные концепции

Блокирующая vs неблокирующая операция:

// Блокирующий подход
String data = readFromSocket(); // Поток ждёт, пока приходят данные
processData(data);
// Неблокирующий подход
readFromSocketAsync(new Callback<String>() {
    @Override
    public void onSuccess(String data) {
        processData(data);
    }
});
// Код продолжает выполняться не дожидаясь результата

Преимущества неблокирующей многозадачности

  • Эффективность ресурсов: один поток может обрабатывать тысячи одновременных операций вместо одной операции за раз
  • Масштабируемость: приложение может обслуживать больше клиентов на одной машине
  • Отзывчивость: интерфейс не замораживается при долгих операциях
  • Производительность: минимизируется контекстное переключение между потоками

Реализация в Java

1. Callbacks (обратные вызовы):

public interface AsyncCallback<T> {
    void onSuccess(T result);
    void onError(Exception e);
}

public void fetchDataAsync(AsyncCallback<String> callback) {
    new Thread(() -> {
        try {
            String result = fetchDataFromServer();
            callback.onSuccess(result);
        } catch (Exception e) {
            callback.onError(e);
        }
    }).start();
}

2. Futures и CompletableFuture:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    return fetchDataFromServer();
});

future.thenAccept(data -> {
    processData(data);
}).exceptionally(ex -> {
    handleError(ex);
    return null;
});

3. Реактивное программирование (Project Reactor, RxJava):

Mono.fromCallable(() -> fetchDataFromServer())
    .subscribeOn(Schedulers.boundedElastic())
    .subscribe(
        data -> processData(data),
        error -> handleError(error),
        () -> System.out.println("Completed")
    );

Event Loop модель

Неблокирующая многозадачность часто реализуется через event loop — цикл, который постоянно проверяет, какие события произошли, и вызывает соответствующие обработчики:

public class SimpleEventLoop {
    private Queue<Runnable> eventQueue = new LinkedList<>();
    
    public void registerEvent(Runnable handler) {
        eventQueue.add(handler);
    }
    
    public void run() {
        while (!eventQueue.isEmpty()) {
            Runnable event = eventQueue.poll();
            event.run();
        }
    }
}

Различие между параллелизмом и неблокирующей многозадачностью

  • Параллелизм: несколько потоков выполняются одновременно на разных ядрах процессора
  • Неблокирующая многозадачность: один или несколько потоков чередуют выполнение множества операций, не блокируя друг друга

Когда использовать

  • I/O-bound приложения: веб-серверы, микросервисы, микроконтроллеры
  • Real-time системы: игровые серверы, системы мониторинга
  • High-throughput системы: обработка большого количества событий

Неблокирующая многозадачность — это неотъемлемая часть современной разработки, особенно при работе с асинхронными операциями и потоками обработки данных в реальном времени.