Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
На первый взгляд кажется, что упомянутые выше методы удобны для управления потоками, но пользоваться ими все же не рекомендуется по следующим причинам. При выполнении метода suspend () иногда возникают серьезные осложнения, приводящие к взаимоблокировке. Метод resume () сам по себе безопасен, но применяется только в сочетании с методом suspend (). Что же касается метода stop () из класса Thread, то и он не рекомендуется к применению, начиная с версии Java 2, поскольку может вызывать порой серьезные осложнения в работе многопоточных программ.
Если методы suspend (), resume () и stop () нельзя использовать для управления потоками, то может показаться, что приостановить, возобновить и остановить поток вообще нельзя. Но это, к счастью, не так. Поток следует разрабатывать таким образом, чтобы в методе run () периодически осуществлялась проверка, следует ли приостановить, возобновить или остановить поток. Обычно для этой цели используются две флаговые переменные: одна — для приостановки и возобновления потока, другая — для остановки потока. Если флаговая переменная, управляющая приостановкой потока, установлена в состояние исполнения, то метод run () должен обеспечить продолжение исполнения потока. Если же эта флаговая переменная находится в состоянии приостановки, в работе потока должна произойти пауза. А если переменная, управляющая остановкой потока, находится в состоянии остановки, исполнение потока должно прекратиться.
Следующий пример программы демонстрирует один из способов реализации собственных версий методов suspend (), resume () и stop ().
// Приостановка, возобновление и остановка потока.
class MyThread implements Runnable {
Thread thrd;
// Если эта переменная принимает логическое значение
// true, исполнение потока приостанавливается.
volatile boolean suspended;
// Если эта переменная принимает логическое значение
// true, исполнение потока прекращается.
volatile boolean stopped;
MyThread(String name) {
thrd = new Thread(this, name);
suspended = false;
stopped = false;
thrd.start();
}
// Точка входа в поток
public void run() {
System.out.println(thrd.getName() + " starting.");
try {
for(int i = 1; i < 1000; i++) {
System.out.print(i + " ");
if((i %10)==0) {
System.out.println() ;
Thread.sleep(250) ;
}
// Для проверки условий приостановки и остановки потока
// используется следужхций синхронизированный блок.
synchronized(this) {
while(suspended) {
wait();
}
if(stopped) break;
}
}
} catch (InterruptedException exc) {
System.out.println(thrd.getName() + " interrupted.");
}
System.out.println(thrd.getName() + " exiting.");
}
// остановить поток
synchronized void mystopO {
stopped = true;
// Следующие операторы обеспечивают полную
// остановку приостановленного потока,
suspended = false;
notify();
}
// приостановить поток
synchronized void mysuspend() {
suspended = true;
}
// возобновить поток
synchronized void myresume() {
suspended = false;
notify();
}
}
class Suspend {
public static void main(String args[]) {
MyThread obi = new MyThread("My Thread");
try {
Thread.sleep(1000); // позволить потоку оЫ начать исполнение
obi.mysuspend();
System.out.println("Suspending thread.");
Thread.sleep(1000);
obi.myresume();
System.out.println("Resuming thread.");
Thread.sleep(1000);
obi.mysuspend();
System.out.println("Suspending thread.");
Thread.sleep(1000);
obi.myresume();