Заочники 2020-2021 / java_zaoch_sem_1
.pdfМногопоточность
Многопоимееисключиточностьпракценностьельнуюическую. |
|
|
||
Нап,брдолженаузеримуметьодновременнозагружать |
|
|
множество |
|
изоб,праженийогсграфическимпользовательскимммыинтерфейсом |
|
|
||
имеютотдельныепотокидлясбораинтерфейсныхсобытийотокружающей |
|
|
||
операционнойсреды. |
|
|
|
|
Рассмотримпрограмму |
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