Многопоточность — способность платформы (например виртуальной машины, операционной системы и т.д.) или приложения выполнять одновременно, то есть без предписанного порядка во времени, несколько параллельных задач — потоков.
Такое разделение позволяет эффективнее использовать ресурсы вычислительной машины, обеспечивает комфортный пользовательский опыт.
Многопоточность в Java
Реализация многопоточности в Java предусматривает параллельное выполнение нескольких частей программы (потоков). Каждый работающий в операционной системе процесс может состоять из нескольких потоков.
Потоки в Java можно создавать двумя способами.
Создание потоков с помощью расширения класса Thread
Метод заключается в создании класса, который расширяет java.lang.Thread класс. Он переопределяет метод run(), доступный в классе Thread. Поток начинает жизненный цикл внутри метода run(). Мы создаем объект нашего нового класса и вызываем метод start(), чтобы начать выполнение потока. Метод start() вызывает метод run() на объекте Thread:
class MultithreadingDemo extends Thread {
public void run()
{
try {
// Вывод на экран номера исполняемого потока
System.out.println(
«Сейчас выполняется » + Thread.currentThread().getId()
+ » поток»);
}
catch (Exception e) {
// Обработка исключений
System.out.println(«Поймано исключение»);
}
}
}
// Главный класс
public class Multithread {
public static void main(String[] args)
{
int n = 8; // Число потоков
for (int i = 0; i < n; i++) {
MultithreadingDemo object
= new MultithreadingDemo();
object.start();
}
}
}
В результате выполнения программа будет выводить на экран номера выполняемых потоков в формате «Сейчас выполняется n-й поток».
Создание потоков с использованием интерфейса Runnable
При использовании этого подхода нужно создать новый класс, реализующий интерфейс java.lang.Runnable и переопределяющий метод run(). После этого появляется экземпляр объекта Thread и вызывается метод start(). Код программы выглядит так:
class MultithreadingDemo implements Runnable {
public void run()
{
try {
// Вывод на экран номера исполняемого потока
System.out.println(
«Сейчас выполняется » + Thread.currentThread().getId()
+ » поток»);
}
catch (Exception e) {
// Обработка исключений
System.out.println(«Поймано исключение»);
}
}
}
// Главный класс
class Multithread {
public static void main(String[] args)
{
int n = 8; // Число потоков
for (int i = 0; i < n; i++) {
Thread object
= new Thread(new MultithreadingDemo());
object.start();
}
}
}
Формат вывода результатов идентичен первому способу.
Сравнение способов создания потоков
В случае расширения Thread созданный нами класс уже не сможет расширить какой-то другой класс, поскольку Java не поддерживает множественное наследование.
Второй способ лишен этого недостатка: при использовании интерфейса Runnable новый класс может расширять другие основные классы. Расширение класса Thread позволяет новому классу получать базовую функциональность, поскольку Thread предоставляет ряд полезных встроенных методов, например yield() и interrupt(). Такая опция недоступна при использовании интерфейса Runnable, однако Runnable может создать объект, который будет общим для нескольких потоков.
Умение писать код, который выполняет многопоточную обработку данных, позволяет разработчику создавать высокоэффективные приложения, оптимально использующие современные многоядерные процессоры.
0 комментариев