Иллюстрированный самоучитель по Java



              

Класс Thread - часть 2


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 i успел отработать полностью до переключения процессора на выполнение второго подпроцесса. Во втором случае работа подпроцесса Thread

i

была прервана, процессор переключился на выполнение подпроцесса Thread 2, успел выполнить его полностью, а затем переключился обратно на выполнение подпроцесса Thread i и завершил его.

Рис. 17.1.

Два подпроцесса работают без задержки

Уберем в листинге 17.1 комментарии, задержав тем самым выполнение каждой итерации цикла на 0,1 секунды. Пустая обработка исключения InterruptedException означает, что мы игнорируем попытку прерывания работы подпроцесса. На рис. 17.2 показан результат двух запусков программы. Как видите, процессор переключается с одного подпроцесса на другой, но в одном месте регулярность переключения нарушается и ранее запущенный подпроцесс завершается позднее.

Рис. 17.2.

Подпроцессы работают с задержкой

Как же добиться согласованности, как говорят,

синхронизации

(synchronization) подпроцессов? Обсудим это ниже, а пока покажем еще два варианта создания той же самой программы.

В листинге 17.2 приведен второй вариант той же программы: сам класс TwoThreads2 является расширением класса Thread, а метод run () реализуется прямо в нем. 

Листинг 17.2.

Класс расширяет Thread

class TwoThreads2 extends Thread{ 

private String msg; 

TwoThreads2(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){} 




Содержание  Назад  Вперед