Skip to content

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.

Зачем нужна многопоточность?

  1. Параллельное выполнение: Позволяет выполнять несколько задач одновременно, что может значительно ускорить выполнение программы.
  2. Реактивность: В GUI-приложениях многопоточность помогает избежать "подвисания" интерфейса, так как длительные операции могут выполняться в фоновом потоке.
  3. Эффективное использование ресурсов: Многопоточность позволяет лучше использовать многоядерные процессоры.

Проблемы многопоточности

При работе с несколькими потоками могут возникать проблемы, такие как:

  • Конкуренция за ресурсы: Если несколько потоков пытаются одновременно получить доступ к одному и тому же ресурсу, это может привести к непредсказуемым результатам.
  • Состояния гонки: Когда результат выполнения зависит от порядка выполнения потоков.

Интерфейс Runnable и класс Thread в Java используются для создания потоков, но у них есть разные подходы и преимущества.

Что такое Runnable и Thread?

  • Thread: Это класс, который представляет поток выполнения. Вы можете создать новый поток, унаследовав класс Thread и переопределив его метод run(), или создать объект Thread, передав ему объект, реализующий интерфейс Runnable.

  • Runnable: Это интерфейс, который определяет единственный метод run(). Он используется для представления задачи, которую можно выполнять в потоке. Вы можете реализовать этот интерфейс в своем классе и передать его объект в конструктор класса Thread.

Преимущества интерфейса Runnable по сравнению с классом Thread:

  1. Наследование: Java поддерживает только одно наследование классов, но вы можете реализовать несколько интерфейсов. Используя Runnable, вы можете наследовать от другого класса, что дает больше гибкости в проектировании.

  2. Разделение задач: Интерфейс Runnable позволяет отделить логику выполнения задачи от логики управления потоком. Это делает код более чистым и удобным для тестирования.

  3. Повторное использование: Объект, реализующий Runnable, можно передавать в разные потоки. Это позволяет использовать одну и ту же задачу в нескольких потоках без необходимости создавать несколько экземпляров класса Thread.

  4. Упрощение кода: Использование 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() будет выполнен в новом потоке.