Создать нить(поток) можно тремя способами:
- расширяя
Thread
; - реализуя
Runnable
; - расширяя
Callable
;
Код класса расширяющего или реализующего что-нибудь выше перечисленное будет выполняться в отдельном потоке.
Мы уже затрагивали создание потоков когда рассматривали PipedOutputStream. И мы помним, что там было два потока и код одного потока выполнялся параллельно коду другого.
Поэтому суть потоков думаю понятна. Параллельное выполнение блоков кода друг другу.
Расширение Thread
Ниже в примере класс MyThread
расширяет Thread
.
Это значит, что в нем должен быть переопределен метод run
.
В этом методе пишется код, который можно запускать в отдельном потоке.
То есть он будет выполняться параллельно другому коду, например тому, в котором выполняется код метода мейн.
Пример программы:
Вывод:

Каждый поток вывел по строке как видим.
Преимущества расширения Thread
Основное преимущество расширения Thread в том, что есть возможность переопределять не только run()
, но и другие методы, такие как start()
.
Пример программы:
Вывод:

Как видим, теперь и при вызове start тоже выводиться строка.
Причем порядок выведения строк на консоль может быть разный. В данном случае, на консоли мы видим, что один поток уже успел завершить свое выполнение перед тем как запустился третий поток.
Table of Contents
Интерфейс Runnable в Java
Преимущества Runnable над Thread: экономия памяти, гибкость кода и поддержка многопоточности. Пример реализации и сравнение подходов.
Volatile переменная в Java
Разберитесь с ключевым словом volatile в Java: как оно обеспечивает видимость изменений переменной для всех потоков. Практический пример использования.
Метод join в Java
Узнайте, как метод join() в Java приостанавливает текущий поток до завершения другого. Примеры кода и объяснение работы с потоками для эффективной синхронизации.