Организация и управление подпроцесами в Java

Программный поток предоставляет некоторую задачу или операцию, поэтому необходимы средства для её выполнения. В языке java существует интерфейс Runnable, содержащий метод run в котором и выполняются все действия. Обычно он содержит некоторый цикл, выполняющийся до выполнения какого-то условия. При реализации данного интерфейса поток, после окончания действий не может вернуть какое-либо значение. Если необходимо, что бы поток возвращал значение — нужно реализовать интерфейс Callable, который вместо метода run содержит метод call. Данный интерфейс параметризирован и после выполнения вернет значения указанного типа. Однако просто реализовав интерфейс выполнения потока не добьешься, поэтому традиционным способом преобразования интерфейса в задачу заключается в передаче его конструктору класса Thread и вызов метода start для потока. Так же можно упомянуть о том, что метод main() выполняется в отдельном потоке. Если создаваемый поток не должен выполнять каких-либо слажных операций — можно просто наследовать от класса Thread. Java так же предоставляет возможность создания потоков-демонов. Демоном называется поток, предоставляющий некоторый сервис, работая в фоновом режиме во время выполнения программы, но при этом не является её неотъемлемой частью. Таким образом при завершении всех основных потоков выполнение программы завершается независимо от тог, завершил ли демон свою работу. Все потоки, порождаемые потоками-демонами так же будут демонами.

Java предоставляет некоторые методы, управляющие выполнением потоков, например метод yield — явное освобождение процессора потоком, для передачи управления другому потоку, однако нет никакой гарантии, что другой поток будет выполняться в это время. Фактически вызов данного метода означает лишь, что очередная важная часть цикла была выполнена и теперь можно на время переключиться на другую задачу.

Другим способом управления вашими потоками является вызов метода sleep(), который переводит поток в состояние ожидания на заданное количество времени. (благодаря включению этого метода в класс TimeUnit его использование стало более удобно, так как можно указывать время не только в милисекундах). Данный метод может выбрасывать исключение InterruptedException.

Потокам можно назначить приоритет. Приоритет передает планировщику информацию об относительной важности потока. Хотя порядок обращения процессора к существующему набору потоков не детерминирован, если существует несколько приостановленных потоков, одновременно ожидающих запуска, планировщик сначала запустит поток с большим приоритетом. Использование приоритетов не означает, что поток с младшим приоритетом не будет выполняться вовсе, он лишь будет выполняться чуть реже. Использование приоритетов не слишком хорошо согласуется с большинством ОС, тк пакет JDK имеет 10 уровней приоритетов, в то время как планировщик Windows имеет 7, поэтому во время использования нестандартных приоритетов лучше использовать только универсальные константы класса Thread.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: