Потоки в Java. Наследуемся от Thread, реализуем интерфейс Runnable

Потоки в Java. Наследуемся от Thread, реализуем интерфейс Runnable

Этой статьей я начинаю цикл статей по многопоточности и параллелизму в Java. Сегодня познакомимся с Thread и интерфейсом Runnable. Для того, чтобы понимать многопоточность в Java, нужно знать некоторые понятия.

Процесс в Java

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

Thread в Java

Thread можно назвать легковесным процесс. Он требует меньше ресурсов для создания и существует в процессе, деля с ним ресурсы.

Многопоточность в Java

Каждая Java программа работает как минимум с одним потоком — главным потоком. Несмотря на то, что есть очень много других потоков, работающих в фоновом режиме: управление памятью, управление системой, обработка сигналов и т.д. Но с точки зрения нашей программы — главным будет первый поток.

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

Преимущества потоков

  1. Потоки намного легче процессов, они требуют меньше времени и ресурсов.
  2. Переключение контекста между потоками намного быстрее, чем между процессами.
  3. Намного проще добиться взаимодействия между потоками, чем между процессами.

Java предоставляет два способа программно создать поток.

  1. Реализация интерфейса java.lang.Runnable.
  2. Расширение класса java.lang.Thread.

Пример создания Thread. Реализуем интерфейс Runnable

Для того, чтобы класс был runnable, мы должны реализовать интерфейс java.lang.Runnable и обеспечить реализацию метода public void run(). Чтобы использовать этот класс, как поток, мы должны создать объект Thread, передавая объект runnable класса, а затем вызвать метод start(), чтобы выполнился метод run() в отдельном потоке.

Вот пример Java класса, реализующего Runnable интерфейс.

Пример создания потока. Наследуем класс Thread

Мы можем наследовать класс java.lang.Thread для создания собственного класса Thread и переопределить метод run(). Тогда мы можем создать экземпляр этого класса и вызвать метод start() для того, чтобы выполнить метод run().

Вот простой пример того, как наследоваться от класса Thread:

Вот тестовая программа, показывающая наш поток в работе:

Runnable vs Thread

Если ваш класс предоставляет больше возможностей, чем просто запускаться в виде Thread, то вам лучше реализовать интерфейс Runnable. Если же вам просто нужно запустить в отдельном потоке, то вы можете наследоваться от класса Thread.

Реализация Runnable является более предпочтительной, поскольку Java поддерживает реализацию нескольких интерфейсов. Если вы наследуете класс Thread, то вы уже не можете наследовать другие классы.

Интересно знать

Начиная с Java 8, Runnable представляет собой функциональный интерфейс и мы можем использовать лямбда-выражения для его реализации, вместо анонимного класса. Следите за обновлениями сайта и вы увидите полное руководство по лямбда выражениям в Java!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *