Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Многопоточность в Java Tutorial с программой и примерами


Любое приложение может иметь несколько процессов (экземпляров). Каждый из этих процессов может быть назначен либо как один поток, либо как несколько потоков. В этом руководстве мы увидим, как выполнять несколько задач одновременно, а также узнаем больше о потоках и синхронизации между потоками.

В этом руководстве по многопоточности в Java мы узнаем:

Что такое один поток?

Один поток в Java — это, по сути, легкая и наименьшая единица обработки. Java использует потоки с помощью «класса потока».

Существует два типа потоков:пользовательский поток и поток демона . (потоки демона используются, когда мы хотим очистить приложение и используются в фоновом режиме).

Когда приложение запускается впервые, создается пользовательский поток. После этого мы можем создать много пользовательских потоков и потоков демонов.

Пример одного потока:

package demotest;

public class GuruThread
{
       public static void main(String[] args) {
              System.out.println("Single Thread");
       }
}

Преимущества одного потока:

Что такое многопоточность в Java?

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

Пример многопоточности:

package demotest;
public class GuruThread1 implements Runnable
{
       public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

Преимущества многопоточности:

Жизненный цикл потока в Java

Жизненный цикл потока:

<центр>

<рисунок>

Жизненный цикл потока в Java

Существуют различные этапы жизненного цикла потока, как показано на диаграмме выше:

  1. Новое
  2. Запускается
  3. Бег
  4. Ожидание
  5. Мертв
  1. Новое: На этом этапе поток создается с использованием класса «Класс потока». Он остается в этом состоянии до запуска программы. нить. Его также называют родившейся нитью.
  2. Запуск: На этой странице экземпляр потока вызывается методом запуска. Управление потоком передается планировщику для завершения выполнения. Запускать ли поток зависит от планировщика.
  3. Выполняется: Когда поток начинает выполняться, его состояние меняется на «выполняется». Планировщик выбирает один поток из пула потоков, и он начинает выполняться в приложении.
  4. Ожидание: Это состояние, когда поток должен ждать. Поскольку в приложении работает несколько потоков, необходима синхронизация между потоками. Следовательно, один поток должен ждать, пока другой поток не будет выполнен. Поэтому это состояние называется состоянием ожидания.
  5. Мертв: Это состояние, когда поток завершается. Поток находится в рабочем состоянии, и как только он завершил обработку, он находится в «мертвом состоянии».


Некоторые из наиболее часто используемых методов для потоков:


Метод

Описание
start() Этот метод запускает выполнение потока, и JVM вызывает для потока метод run().
Спящий режим (целые миллисекунды) Этот метод переводит поток в спящий режим, поэтому выполнение потока приостанавливается на предоставленные миллисекунды, после чего поток снова начинает выполняться. Это помогает в синхронизации потоков.
getName() Возвращает имя потока.
setPriority(int newpriority) Изменяет приоритет потока.
выход () Приводит к остановке текущего потока и выполнению других потоков.

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

package demotest;
public class thread_example1 implements Runnable {
    @Override
    public void run() {
    }
    public static void main(String[] args) {
        Thread guruthread1 = new Thread();
        guruthread1.start();
        try {
            guruthread1.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        guruthread1.setPriority(1);
        int gurupriority = guruthread1.getPriority();
        System.out.println(gurupriority);
        System.out.println("Thread Running");
  }
}

Пояснение кода:

Когда вы выполняете приведенный выше код, вы получаете следующий вывод:

Вывод:

5 – это приоритет потока, а Thread Running – текст, который выводит наш код.

Синхронизация потоков Java

В многопоточности существует асинхронное поведение программ. Если один поток записывает некоторые данные, а другой поток одновременно считывает данные, это может привести к несогласованности в приложении.

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

Java предоставляет синхронизированные методы для реализации синхронизированного поведения.

При таком подходе, как только поток попадает внутрь синхронизированного блока, ни один другой поток не может вызвать этот метод для того же объекта. Все потоки должны ждать, пока этот поток завершит синхронизированный блок и выйдет из него.

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

Его можно записать в следующем виде:

Synchronized(object)
{  
        //Block of statements to be synchronized
}

Пример многопоточности в Java

В этом многопоточном примере Java мы возьмем два потока и получим имена потоков.

Пример 1:

GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{

    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

Пояснение кода:

Когда вы выполняете приведенный выше код, вы получаете следующий вывод:

Вывод:

Имена потоков выводятся здесь как

Пример 2:

В этом примере многопоточности в Java мы узнаем о переопределении методов run() и start() запускаемого интерфейса, а также создадим два потока этого класса и запустим их соответственно.

Кроме того, мы посещаем два занятия,

package demotest;
public class GuruThread2 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  GuruThread3 threadguru1 = new GuruThread3("guru1");
  threadguru1.start();
  GuruThread3 threadguru2 = new GuruThread3("guru2");
  threadguru2.start();
 }
}
class GuruThread3 implements Runnable {
 Thread guruthread;
 private String guruname;
 GuruThread3(String name) {
  guruname = name;
 }
 @Override
 public void run() {
  System.out.println("Thread running" + guruname);
  for (int i = 0; i < 4; i++) {
   System.out.println(i);
   System.out.println(guruname);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    System.out.println("Thread has been interrupted");
   }
  }
 }
 public void start() {
  System.out.println("Thread started");
  if (guruthread == null) {
   guruthread = new Thread(this, guruname);
   guruthread.start();
  }
 }
}

Пояснение кода:

Когда вы выполняете приведенный выше код, вы получаете следующий вывод:

Вывод :

Следовательно, есть два потока, мы дважды получаем сообщение «Поток запущен».

Мы получаем имена потоков в том виде, в каком мы их вывели.

Он входит в цикл for, где мы печатаем счетчик и имя потока, а счетчик начинается с 0.

Цикл выполняется три раза, а между ними поток приостанавливается на 1000 миллисекунд.

Следовательно, сначала мы получаем guru1, затем guru2, затем снова guru2, потому что здесь поток спит 1000 миллисекунд, а затем следующий guru1 и снова guru1, поток спит 1000 миллисекунд, поэтому мы получаем guru2, а затем guru1.

Обзор

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


java

  1. Java-программа Hello World
  2. Функции C++ с примерами программ
  3. Учебное пособие по коллекциям C# с примерами
  4. Метод Java String indexOf() с подстрокой и примерами
  5. Метод Java String charAt() с примером
  6. Метод Java String compareTo():​​как использовать с примерами
  7. Перегрузка конструктора в Java:что это такое и примеры программ
  8. Java-программа для проверки простого числа
  9. Алгоритм сортировки вставками в Java с примером программы
  10. Сортировка выбором в программе Java с примером