Класс Thread
В классе Thread семь конструкторов:
- Thread(ThreadGroup group, Runnabie target, String name) – создает подпроцесс с именем name, принадлежащий группе group и выполняющий метод run () объекта target. Это основной конструктор, все остальные обращаются к нему с тем или иным параметром, равным null;
- Thread () – создаваемый подпроцесс будет выполнять свой метод run ();
- Thread(Runnabie target);
- Thread(Runnabie target, String name);
- Thread(String name);
- Thread(ThreadGroup group, Runnabie target);
- Thread(ThreadGroup group, String name).
Имя подпроцесса name не имеет никакого значения, оно не используется, виртуальной машиной Java и применяется только для различения подпроцессов в программе.
После создания подпроцесса его надо запустить методом start (). Виртуальная машина Java начнет выполнять метод run () этого объекта-подпроцесса.
Подпроцесс завершит работу после выполнения метода run (). Для уничтожения объекта-подпроцесса вслед за этим он должен присвоить значение null.
Выполняющийся подпроцесс можно приостановить статическим методом sleep (long ms) на ms миллисекунд. Этот метод мы уже использовали в предыдущих главах. Если вычислительная система может отсчитывать наносекунды, то можно приостановить подпроцесс с точностью до наносекунд методом sleep(long ms, int nanosec).
В листинге 17.1 приведен простейший пример. Главный подпроцесс создает два подпроцесса с именами Thread 1 и Thread 2, выполняющих один и тот же метод run (). Этот метод просто выводит 20 раз текст на экран, а затем сообщает о своем завершении.
Листинг 17.1. Два подпроцесса, запущенных из главного подпроцесса.
class OutThread extends Thread{ private String msg; OutThread(String s, String name){ super(name); msg = s; } public void run() { for(int i = 0; i < 20; i++){ // try{ // Thread.sleep(100); // }catch(InterruptedException ie){} System.out.print(msg + " "); } System.out.println("End of " + getName()); } } class TwoThreads{ public static void main(String[] args){ new OutThread("HIP", "Thread 1").start(); new OutThread("hop", "Thread 2").start(); System.out.println(); } }
На рис. 17.1 показан результат двух запусков программы листинга 17.1. Как видите, в первом случае подпроцесс Thread 1 успел отработать полностью до переключения процессора на выполнение второго подпроцесса. Во втором случае работа подпроцесса Thread 1 была прервана, процессор переключился на выполнение подпроцесса Thread 2, успел выполнить его полностью, а затем переключился обратно на выполнение подпроцесса Thread 1 и завершил его.
Рис. 17.1. Два подпроцесса работают без задержки