Назад к вопросам
Junior
87
questionbank

Что такое многопоточность, параллелизм и асинхронность?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Многопоточность (Multithreading) — способность программы выполнять несколько потоков выполнения в рамках одного процесса. Потоки разделяют общую память.
  • Параллелизм (Parallelism) — одновременное выполнение нескольких задач (процессов или потоков) на нескольких вычислительных ресурсах (ядрах процессора, машинах).
  • Асинхронность (Asynchrony) — способ выполнения задачи, при котором основной поток не блокируется в ожидании завершения побочной операции. Задача запускается, и управление возвращается сразу, а результат обрабатывается позже, по завершении операции (например, с помощью колбэков или Future/CompletableFuture).
Концепция Одновременность Блокировка основного потока Ресурсы выполнения Основная цель
Многопоточность Может быть или нет Нет (при правильной работе) Одно или несколько ядер Улучшение отзывчивости, утилизация ядер
Параллелизм Да Нет (для потоков) Несколько вычислительных ресурсов Увеличение производительности
Асинхронность Может быть или нет Нет Зависит от реализации Неблокирующий ввод/вывод, отзывчивость
// Пример многопоточности в Java
public class MultithreadingExample {

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> { // Поток 1
            System.out.println("Поток 1 запущен.");
            // Выполнение какой-то задачи
            System.out.println("Поток 1 завершен.");
        });

        Thread thread2 = new Thread(() -> { // Поток 2
            System.out.println("Поток 2 запущен.");
            // Выполнение другой задачи
            System.out.println("Поток 2 завершен.");
        });

        thread1.start(); // Запуск потока 1
        thread2.start(); // Запуск потока 2
    }
}
// Пример асинхронности в Java с использованием CompletableFuture
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class AsynchronousExample {

    public static CompletableFuture<String> fetchDataAsync() {
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("Асинхронная операция запущена...");
            try {
                Thread.sleep(2000); // Имитация длительной операции
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Асинхронная операция завершена.");
            return "Данные получены";
        });
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("Основной поток: Начинаем получать данные асинхронно.");
        CompletableFuture<String> futureData = fetchDataAsync(); // Запуск асинхронной задачи

        System.out.println("Основной поток: Продолжаем работу, не дожидаясь результата.");

        // Обработка результата, когда он станет доступен
        futureData.thenAccept(result -> {
            System.out.println("Основной поток: Получен асинхронный результат: " + result);
        });

        // Или, если нужно дождаться результата (блокирующий вызов)
        // String data = futureData.get();
        // System.out.println("Основной поток: Получен синхронный результат: " + data);

        System.out.println("Основной поток: Основная работа выполнена.");
        // Важно: главный поток должен оставаться активным, чтобы thenAccept выполнился
        Thread.sleep(3000); // Имитация ожидания
    }
}