1. Thread
есть функциональное т.е. последовательное программирование
есть асинхронное программирование
эти два работают в одном потоке
а есть многопоточный тип программирования а этот тип в нескольких потоках выполняется одна программа
в java многопоточность реализована с помощью класса Thread
//получение текущего потока
Thread t = Thread.currentThread()
System.out.println(t.getName());
свои потоки можно создавать создавая классы наследники от Thread
public static void main(String[] args) {
Thread t = new MyThread("поток1");
t.start();
}
static class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println(this.getName());
}
}
именно метод start создаёт и вызывает поток
потоки выполняются асинхронно и параллельно и поэтому порядок выполнения потоков достаточно хаотичен и почти не поддаётся прогнозированию
метод sleep вызывает задержку потока
метод isAlive позволяет понять поток ещё работает или уже отработал
метод join останавливает выполнение программы до тех пор пока не завершится поток этот метод которого мы вызвали
пример
https://gitlab.com/synergy9980417/razdel2/2_1
Многопоточность в Java
Многопоточность — это возможность выполнения нескольких потоков одновременно, что позволяет эффективно использовать ресурсы процессора и улучшать производительность приложений. В Java многопоточность реализуется с помощью класса Thread и интерфейса Runnable.
Зачем нужна многопоточность?
- Параллельное выполнение: Позволяет выполнять несколько задач одновременно, что может значительно ускорить выполнение программы.
- Реактивность: В GUI-приложениях многопоточность помогает избежать "подвисания" интерфейса, так как длительные операции могут выполняться в фоновом потоке.
- Эффективное использование ресурсов: Многопоточность позволяет лучше использовать многоядерные процессоры.
Проблемы многопоточности
При работе с несколькими потоками могут возникать проблемы, такие как:
- Конкуренция за ресурсы: Если несколько потоков пытаются одновременно получить доступ к одному и тому же ресурсу, это может привести к непредсказуемым результатам.
- Состояния гонки: Когда результат выполнения зависит от порядка выполнения потоков.
Интерфейс Runnable
и класс Thread
в Java используются для создания потоков, но у них есть разные подходы и преимущества.
Что такое Runnable
и Thread
?
-
Thread
: Это класс, который представляет поток выполнения. Вы можете создать новый поток, унаследовав классThread
и переопределив его методrun()
, или создать объектThread
, передав ему объект, реализующий интерфейсRunnable
. -
Runnable
: Это интерфейс, который определяет единственный методrun()
. Он используется для представления задачи, которую можно выполнять в потоке. Вы можете реализовать этот интерфейс в своем классе и передать его объект в конструктор классаThread
.
Преимущества интерфейса Runnable
по сравнению с классом Thread
:
-
Наследование: Java поддерживает только одно наследование классов, но вы можете реализовать несколько интерфейсов. Используя
Runnable
, вы можете наследовать от другого класса, что дает больше гибкости в проектировании. -
Разделение задач: Интерфейс
Runnable
позволяет отделить логику выполнения задачи от логики управления потоком. Это делает код более чистым и удобным для тестирования. -
Повторное использование: Объект, реализующий
Runnable
, можно передавать в разные потоки. Это позволяет использовать одну и ту же задачу в нескольких потоках без необходимости создавать несколько экземпляров классаThread
. -
Упрощение кода: Использование
Runnable
может привести к более простому и понятному коду, особенно когда вы работаете с анонимными классами или лямбда-выражениями (в Java 8 и выше).
Пример использования:
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
В этом примере класс MyRunnable
реализует интерфейс Runnable
, и его метод run()
будет выполнен в новом потоке.