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

Приостановить (задержать) выполнение потока можно с помощью метода 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 */

}

}

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

Старт потока First

Старт потока Second

завершение потока Second

завершение потока First

завершение main

Несмотря на вызов метода join() для потока tr1, поток tr2 будет работать, в отличие от потока main, который сможет продолжить свое выполнение только по завершении потока tr1.

Вызов метода yield() для исполняемого потока должен приводить к приостановке потока на некоторый квант времени, для того чтобы другие потоки могли выполнять свои действия. Однако если требуется надежная остановка потока, то следует использовать его крайне осторожно или вообще применить другой способ.

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

package chapt14;

public class YieldRunner {

public static void main(String[] args) {

new Thread() {

public void run() {

System.out.println("старт потока 1");

Thread.yield();

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

}

}.start();

new Thread() {

public void run() {

System.out.println("старт потока 2");

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

}

}.start();

}

}

В результате может быть выведено:

старт потока 1

старт потока 2

завершение 2

завершение 1

Активизация метода yield() в коде метода run() первого объекта потока приведет к тому, что, скорее всего, первый поток будет остановлен на некоторый квант времени, что даст возможность другому потоку запуститься и выполнить свой код.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100