В Java существует несколько способов создания потоков (threads). Рассмотрим основные подходы:
Самый простой способ - создать класс, наследующий Thread
, и переопределить метод run()
:
class MyThread extends Thread {
@Override
public void run() {
// Код, который будет выполняться в потоке
System.out.println("Поток работает: " + Thread.currentThread().getId());
}
}
// Использование:
MyThread thread = new MyThread();
thread.start(); // Запускает новый поток
Важно: Не вызывайте run()
напрямую - это выполнит код в текущем потоке. Для запуска нового потока всегда используйте start()
.
Более предпочтительный способ, так как Java не поддерживает множественное наследование:
class MyRunnable implements Runnable {
@Override
public void run() {
// Код для выполнения в потоке
System.out.println("Поток Runnable: " + Thread.currentThread().getId());
}
}
// Использование:
Thread thread = new Thread(new MyRunnable());
thread.start();
Сокращенная форма через лямбда-выражения:
Thread thread = new Thread(() -> {
System.out.println("Лямбда-поток: " + Thread.currentThread().getId());
});
thread.start();
Для потоков, которые должны возвращать результат:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
// Долгая операция
return "Результат выполнения";
});
// Получение результата (блокирует поток, пока результат не будет готов)
String result = future.get();
executor.shutdown();
Для эффективного управления множеством потоков:
ExecutorService threadPool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
threadPool.submit(() -> {
System.out.println("Задача выполняется в потоке: " + Thread.currentThread().getId());
});
}
threadPool.shutdown();
setPriority()
, но ОС может их игнорироватьsetDaemon(true)
) завершаются при завершении main-потокаsynchronized
, volatile
или классы из java.util.concurrent
Исключения в потоках можно перехватывать через UncaughtExceptionHandler
:
thread.setUncaughtExceptionHandler((t, e) -> {
System.err.println("Исключение в потоке " + t.getName() + ": " + e);
});
В Java есть несколько способов создания потоков, каждый со своими преимуществами. Для простых задач подойдут Thread
или Runnable
, для более сложных - ExecutorService
и пулы потоков. Всегда учитывайте вопросы синхронизации и обработки исключений при работе с многопоточностью.