АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вопрос 13.5

Читайте также:
  1. E. Некорректный вопрос
  2. I. Перечень вопросов и тем для подготовки к экзамену
  3. II. Вопросительное предложение
  4. VII. Вопросник для анализа учителем особенностей индивидуального стиля своей педагогической деятельности (А.К. Маркова)
  5. X. примерный перечень вопросов к итоговой аттестации
  6. Аграрный вопрос
  7. Анализ влияния рекламы на продвижение противопростудных средств
  8. Балканский вопрос в начале XXв. Русско-германские отношения
  9. Бланк вопросов
  10. БЛОК № 1 (1 – 10 вопрос)
  11. БЛОК № 2 (11 – 20 вопрос)
  12. Блок № 4 (31 – 40 вопрос)

Объект JСheckBox объявлен следующим образом:

JCheckBox ob = new JCheckBox();

Какая из следующих команд зарегистрирует его в блоке прослушивания событий?

1) ob.addItemListener();

2) ob.addItemListener(this);

3) addItemListener(this);

4) addItemListener();

5) ни одна из приведенных.»

 
Глава 14

ПОТОКИ ВЫПОЛНЕНИЯ

Класс Thread и интерфейс Runnable

К большинству современных распределенных приложений (Rich Client)
и Web-приложений (Thin Client) выдвигаются требования одновременной поддержки многих пользователей, каждому из которых выделяется отдельный поток, а также разделения и параллельной обработки информационных ресурсов. Потоки – средство, которое помогает организовать одновременное выполнение нескольких задач, каждую в независимом потоке. Потоки представляют собой классы, каждый из которых запускается и функционирует самостоятельно, автономно (или относительно автономно) от главного потока выполнения программы. Существуют два способа создания и запуска потока: расширение класса Thread или реализация интерфейса Runnable.

// пример # 1: расширение класса Thread: Talk.java

package chapt14;

public class Talk extends Thread {

public void run() {

for (int i = 0; i < 8; i++) {

System. out. println("Talking");

try {

// остановка на 400 миллисекунд

Thread. sleep (400);

} catch (InterruptedException e) {

System. err. print(e);

}

}

}

}

При реализации интерфейса Runnable необходимо определить его единственный абстрактный метод run(). Например:

/* пример # 2: реализация интерфейса Runnable: Walk.java: WalkTalk.java */

package chapt14;

 

public class Walk implements Runnable {

public void run() {

for (int i = 0; i < 8; i++) {

System. out. println("Walking");

try {

Thread. sleep (400);

} catch (InterruptedException e) {

System. err. println(e);

}

}

}

}

package chapt14;

 

public class WalkTalk {

public static void main(String[] args) {

// новые объекты потоков

Talk talk = new Talk();

Thread walk = new Thread(new Walk());

// запуск потоков

talk.start();

walk.start();

 

//Walk w = new Walk(); // просто объект, не поток

// w.run(); //выполнится метод, но поток не запустится!

}

}

Использование двух потоков для объектов классов Talk и Walk приводит
к выводу строк: Talking Walking. Порядок вывода, как правило, различен при нескольких запусках приложения.

Жизненный цикл потока

Новый
Работоспособный
Неработоспособный
Пассивный

При выполнении программы объект класса Thread может быть в одном из четырех основных состояний: “новый”, “работоспособный”, “неработоспособный” и “пассивный”. При создании потока он получает состояние “новый” (NEW) и не выполняется. Для перевода потока из состояния “новый” в состояние “работоспособный” (RUNNABLE) следует выполнить метод start(), который вызывает метод run() – основной метод потока.

Рис. 14.1. Состояния потока

Поток может находиться в одном из состояний, соответствующих элементам статически вложенного перечисления Thread.State:

NEW – поток создан, но еще не запущен;

RUNNABLE – поток выполняется;

BLOCKED – поток блокирован;

WAITING – поток ждет окончания работы другого потока;

TIMED_WAITING – поток некоторое время ждет окончания другого потока;

TERMINATED — поток завершен.

Получить значение состояния потока можно вызовом метода getState().

Поток переходит в состояние “неработоспособный” (WAITING) вызовом методов wait(), suspend() (deprecated-метод)или методов ввода/вывода, которые предполагают задержку. Для задержки потока на некоторое время (в миллисекундах) можно перевести его в режим ожидания (TIMED_WAITING) с помощью методов sleep(long millis) и wait(long timeout), при выполнении которого может генерироваться прерывание InterruptedException. Вернуть потоку работоспособность после вызова метода suspend() можно методом resume() (deprecated-метод), а после вызова метода wait() – методами notify() или notifyAll(). Поток переходит в “пассивное” состояние (TERMINATED), если вызваны методы interrupt(), stop() (deprecated-метод)или метод run() завершил выполнение. После этого, чтобы запустить поток еще раз, необходимо создать новый объект потока. Метод interrupt() успешно завершает поток, если он находится в состоянии “работоспособность”. Если же поток неработоспособен, то метод генерирует исключительные ситуации разного типа в зависимости от способа остановки потока.

Интерфейс Runnable не имеет метода start(), а только единственный метод run(). Поэтому для запуска такого потока, как Walk, следует создать объект класса Thread и передать объект Walk его конструктору. Однако при прямом вызове метода run() поток не запустится, выполнится только тело самого метода.

Методы suspend(), resume() и stop() являются deprecated-методами и запрещены к использованию, так как они не являются в полной мере “потоко-
безопасными”.

Управление приоритетами и группы потоков

Потоку можно назначить приоритет от 1 (константа MIN_PRIORITY) до 10 (MAX_PRIORITY) с помощью метода setPriority(int prior). Получить значение приоритета можно с помощью метода getPriority().

// пример # 3: демонстрация приоритетов: PriorityRunner.java: PriorThread.java

package chapt14;

public class PriorThread extends Thread {

public PriorThread(String name){

super (name);

}

public void run(){

for (int i = 0; i < 71; i++){

System. out. println(getName() + " " + i);

try {

sleep (1); //попробовать sleep(0);

} catch (InterruptedException e) {

System. err. print("Error" + e);

}

}

}

}

package chapt14;

 

public class PriorityRunner {

public static void main(String[] args) {

PriorThread min = new PriorThread("Min"); //1

PriorThread max = new PriorThread("Max"); //10

PriorThread norm = new PriorThread("Norm"); //5

min.setPriority(Thread.MIN_PRIORITY);

max.setPriority(Thread.MAX_PRIORITY);

norm.setPriority(Thread.NORM_PRIORITY);

min.start();

norm.start();

max.start();

}

}

Поток с более высоким приоритетом в данном случае, как правило, монополизирует вывод на консоль.

Потоки объединяются в группы потоков. После создания потока нельзя изменить его принадлежность к группе.

ThreadGroup tg = new ThreadGroup("Группа потоков 1");

Thread t0 = new Thread(tg, "поток 0");

Все потоки, объединенные группой, имеют одинаковый приоритет. Чтобы определить, к какой группе относится поток, следует вызвать метод
getThreadGroup(). Если поток до включения в группу имел приоритет выше приоритета группы потоков, то после включения значение его приритета станет равным приоритету группы. Поток же со значением приоритета более низким, чем приоритет группы после включения в оную, значения своего приоритета не изменит.

Управление потоками

Приостановить (задержать) выполнение потока можно с помощью метода sleep( время задержки ) класса Thread. Менее надежный альтернативный способ состоит в вызове метода yield(), который может сделать некоторую паузу и позволяет другим потокам начать выполнение своей задачи. Метод join() блокирует работу потока, в котором он вызван, до тех пор, пока не будет закончено выполнение вызывающего метод потока.

// пример # 4: задержка потока: JoinRunner.java

package chapt14;

class Th extends Thread {

public Th(String str) {

super ();

setName(str);

}

public void run() {

String nameT = getName();

System. out. println("Старт потока " + nameT);

if ("First".equals(nameT)) {

try {

sleep (5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System. out. println("завершение потока "

+ nameT);

} else if ("Second".equals(nameT)) {

try {

sleep (1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System. out. println("завершение потока "

+ nameT);

}

}

}

public class JoinRunner {

public static void main(String[] args) {

Th tr1 = new Th("First");

Th tr2 = new Th("Second");

tr1.start();

tr2.start();

try {

tr1.join();

System. out. println("завершение main");

} catch (InterruptedException e){

e.printStackTrace();

}

/* join() не дает работать потоку main до окончания выполнения потока tr1 */

}

}

Возможно, будет выведено:


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.)