Рубрики
Без рубрики

Пример потока Java

Пример потока Java. Создайте поток в java, реализовав управляемый интерфейс или расширьте класс потока. пример многопоточной программы java, приоритет потока.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в пример потока Java. Процесс и Поток являются двумя основными единицами выполнения. Программирование с параллелизмом больше связано с потоками java.

Процесс

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

Нить

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

Пример потока Java

Каждое приложение java имеет по крайней мере один поток – основной поток . Хотя существует так много других потоков java, работающих в фоновом режиме, таких как управление памятью, управление системой, обработка сигналов и т.д. Но с точки зрения приложения – main-это первый поток java, и мы можем создать из него несколько потоков.

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

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

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

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

  1. Реализация java.lang.Запускаемый интерфейс.
  2. Расширение java.lang.Поток класс.

Пример потока Java – реализация управляемого интерфейса

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

Вот пример потока java, реализующего управляемый интерфейс.

package com.journaldev.threads;

public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

Пример потока Java – расширение класса потока

Мы можем расширить java.lang.Поток класс, чтобы создать наш собственный класс потока java и переопределить метод run () . Затем мы можем создать его объект и вызвать start() метод для выполнения нашего пользовательского метода запуска класса java thread.

Вот простой пример потока java, показывающий, как расширить класс потока.

package com.journaldev.threads;

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
    
}

Вот тестовая программа, показывающая, как создать поток java и выполнить его.

package com.journaldev.threads;

public class ThreadRunExample {

    public static void main(String[] args){
        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
        System.out.println("Starting Runnable threads");
        t1.start();
        t2.start();
        System.out.println("Runnable Threads has been started");
        Thread t3 = new MyThread("t3");
        Thread t4 = new MyThread("t4");
        System.out.println("Starting MyThreads");
        t3.start();
        t4.start();
        System.out.println("MyThreads has been started");
        
    }
}

Вывод приведенного выше примера программы java-потока является:

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1

Как только мы запускаем какой-либо поток, его выполнение зависит от реализации временной срезки в ОС, и мы не можем контролировать их выполнение. Однако мы можем установить приоритет потоков, но даже в этом случае это не гарантирует, что поток с более высоким приоритетом будет выполнен первым.

Запустите вышеуказанную программу несколько раз, и вы увидите, что нет никакого шаблона начала и окончания потоков.

Запускаемый против потока

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

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

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

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