Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Заочники 2020-2021 / java_zaoch_sem_1

.pdf
Скачиваний:
80
Добавлен:
15.06.2021
Размер:
264.96 Кб
Скачать

Многопоточность

Многопоимееисключиточностьпракценностьельнуюическую.

 

 

Нап,брдолженаузеримуметьодновременнозагружать

 

 

множество

изоб,праженийогсграфическимпользовательскимммыинтерфейсом

 

 

имеютотдельныепотокидлясбораинтерфейсныхсобытийотокружающей

 

 

операционнойсреды.

 

 

 

Рассмотримпрограмму

ball_1. Этапрограанимируетпрыгающийяч

не

используямногопоточно

сть.Еслинажатькнопку

start,томячикначнет

двигаться.Приэтом,обработкаперемещмячиказанимаетвпотоксьния,

 

 

 

поэтому,покамячикнепрекратитдвигатьсяневозможнобудет

 

 

 

взаимодействоватьпрограммой.

 

 

 

Теперьперейдемкмногопоточнойреализации

 

программы.

Найготовыйи

кодможнов

ball_2.

 

 

 

Рассмотримпроцедуругенерациипотока.

 

 

 

1. Поместикодзадачивметодь

run класса,реализующегоинтерфейс

 

Runnable

 

 

 

(http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html). Этот

интерфейссодержитединст

венныймтеод.

 

 

public interface Runnable {

 

 

 

void run();

 

 

 

}

public class MyRunnable implements Runnable { public void run() {

// туткод,которыйнужновыполнитьотдельномпотоке.

}

}

2.Создатьобъект этогокласса.

Runnable r = new MyRunnable();

31

3.Создатьобъект Thread (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html) из

Runnable

Thread t = new Thread(r);

4.Запотокустить t.start();

Состояниепотока

Потокимогутпребыватьодномишестисостояний:

новый;

работоспособный;

блокированный;

ожидающий;

временноожидающий;

завершенный.

Когдавытолькосоздалип токперацией

 

new,потокещенезапущен.Он

находитсявсост“ ”вый.янии

 

 

Послевызовам start()тода

потокказывается

работсос.тояниипособном

Работоспособный отокможетвданнмоментвыйпол,аможетинет. яться

 

Этозависитотоперационнойсистемы

– будетливыделенопотокувремяна

выполнение.

 

 

Когдапотокзаблокированилинаходитсясостояожидания, ии

 

 

временнонеактивен.Онневыполняетикодаиакого

 

потребляетминимум

ресурсов.

 

 

Потокзавершапооднойизслепричинтсядующчх.Либоонумирает,в

 

 

случае,еслиметодrun

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

из-занеперехваченногоисключенияметоде

 

run().

Синхронизацияпотоков

В Java существуетбольшоеколичеразныхспособовтвоинхронизировать потоки.Рассмотримнекоторыеизних.

32

1. Испословаьзование

 

synchronized.

 

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

 

объявитьметодкак

synchronized. Например,

public synchronized void do() {/*туткод

*/}

Метод do можетдновремевызыватьсятолькоодпотнимно. ком

 

Втовариантиспользоватьой

 

synchronized блок.

public void do() {

 

 

 

 

 

 

synchronized(v) {

 

 

 

// критическаясекция

 

 

 

}

 

 

 

}

 

 

 

Блоквнутриэтогокодамвызыватьсяжеттол

 

 

ькооднипотокомв

кактомоментвыпй.Вселнениястальныебудутблокированы.

В

качпествеременной

 

v можетбытьуказанабсолютно.ъектой

2.Использование ReentrantLock (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Reentran tLock.html)

Например,

ReentrantLock myLock = new ReentrantLock(); myLock.lock();

try {

}finally { myLock.unlock();

}

3.ReentrantReadWriteLock (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Reentran

tReadWriteLock.html)

Использаналобычгичноваиеому

ReentrantLock.

33

34

Соседние файлы в папке Заочники 2020-2021