|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Вопрос 13.5Объект JСheckBox объявлен следующим образом: JCheckBox ob = new JCheckBox(); Какая из следующих команд зарегистрирует его в блоке прослушивания событий? 1) ob.addItemListener(); 2) ob.addItemListener(this); 3) addItemListener(this); 4) addItemListener(); 5) ни одна из приведенных.» ПОТОКИ ВЫПОЛНЕНИЯ Класс Thread и интерфейс Runnable К большинству современных распределенных приложений (Rich Client) // пример # 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 приводит Жизненный цикл потока
При выполнении программы объект класса 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"); Все потоки, объединенные группой, имеют одинаковый приоритет. Чтобы определить, к какой группе относится поток, следует вызвать метод Управление потоками Приостановить (задержать) выполнение потока можно с помощью метода 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 */ } } Возможно, будет выведено: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.015 сек.) |