Автор оригинала: 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 .