Автор оригинала: Pankaj Kumar.
Добро пожаловать в пример потока Java. Процесс и Поток являются двумя основными единицами выполнения. Программирование с параллелизмом больше связано с потоками java.
Процесс
Процесс-это автономная среда выполнения, и его можно рассматривать как программу или приложение. Однако сама программа содержит в себе несколько процессов. Среда выполнения Java работает как единый процесс, который содержит различные классы и программы в качестве процессов.
Нить
Поток можно назвать облегченным процессом . Поток требует меньше ресурсов для создания и существует в процессе, поток совместно использует ресурсы процесса.
Пример потока Java
Каждое приложение java имеет по крайней мере один поток – основной поток . Хотя существует так много других потоков java, работающих в фоновом режиме, таких как управление памятью, управление системой, обработка сигналов и т.д. Но с точки зрения приложения – main-это первый поток java, и мы можем создать из него несколько потоков.
Многопоточность относится к двум или более потокам, выполняемым одновременно в одной программе. Одноядерный процессор компьютера может выполнять только один поток за раз, и разделение времени – это функция операционной системы для совместного использования процессорного времени между различными процессами и потоками.
Преимущества потока Java
- Потоки Java имеют меньший вес по сравнению с процессами, для создания потока требуется меньше времени и ресурсов.
- Потоки совместно используют данные и код родительского процесса
- Переключение контекста между потоками обычно обходится дешевле, чем между процессами.
- Взаимодействие потоков относительно проще, чем взаимодействие процессов.
Java предоставляет два способа создания потока программно.
- Реализация java.lang.Запускаемый интерфейс.
- Расширение 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 .