×
Traktatov.net » Философия Java » Читать онлайн
Страница 349 из 395 Настройки

Потоки-демоны

Демоном называется поток, предоставляющий некоторый сервис, работая в фоновом режиме во время выполнения программы, но при этом не является ее неотъемлемой частью. Таким образом, когда все потоки не-демоны заканчивают свою деятельность, программа завершается. И наоборот, если существуют работающие потоки не-демоны, программа продолжает выполнение. Существует, например, поток не-демон, выполняющий метод main().

//: concurrency/SimpleDaemons.java

// Потоки-демоны не препятствуют завершению работы программы

import java.util.concurrent.*.

import static net mindview.util.Print.*;

public class SimpleDaemons implements Runnable { public void run() { try {

while(true) {

TimeUni t.MILLISECONDS.sieep(100). print(Thread.currentThread() + " >H + this);

}

} catch(InterruptedException e) {

printC'sleepO interrupted").

}

}

public static void main(String[] args) throws Exception { for(int i = 0. i < 10; i++) {

Thread daemon = new Thread(new SimpleDaemonsO).

daemon setDaemon(true); // Необходимо вызвать перед startO

daemon. startO;

}

printCBce демоны запущены"). TimeUnit.MILLISECONDS sleep(175);

}

} /* Output: Все демоны запущены

Thread[Thread-0.5.main] SimpleDaemons@530daa Thread[Thread-1.5.main] SimpleDaemons@a62fc3 Thread[Thread-2.5.main] SimpleDaemons@89ae9e Thread[Thread-3,5,main] SimpleDaemons@1270b73 Thread[Thread-4.5.main] SimpleDaemons@60aeb0 Thread[Thread-5.5.main] SimpleDaemons@16caf43 Thread[Thread-6.5.main] SimpleDaemons@66848c Thread[Thread-7.5.main] SimpleDaemons@8813f2 Thread[Thread-8.5.main] SimpleDaemons@ld58aae Thread[Thread-9.5.main] SimpleDaemons@83cc67

*///:-

Чтобы назначить поток демоном, следует перед его запуском вызвать метод setDaemon().

После того как main() завершит свою работу, ничто не препятствует завершению программы, поскольку в процессе не работают другие потоки, кроме демонов. Чтобы результаты запуска всех потоков-демонов были более наглядными, поток main() на некоторое время погружается в «сон». Без этого вы увидели бы только часть результатов при создании демонов. (Поэкспериментируйте с вызовом sleep() для интервалов разной продолжительности.)

В примере SimpleDaemons.java используется явное создание объектов Thread для установки их «демонского» флага. Вы также можете настроить атрибуты (демон, приоритет, имя) потоков, созданных исполнителем; для этого следует написать пользовательскую реализацию ThreadFactory:

//: net/mi ndvi ew/uti1/DaemonThreadFactory.java package net.mindview.util;

import java util.concurrent.*;

public class DaemonThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread t = new Thread(r), t.setDaemon(true); return t,

}

} /// -

Единственное отличие от обычной реализации ThreadFactory заключается в том, что в данном случае атрибут демона задается равным true. Теперь новый объект DaemonThreadFactory передается в аргументе Executors.newCachedThread-Pool():

//: concurrency/DaemonFromFactory java

// Использование ThreadFactory для создания демонов.

import java.util.concurrent.*;

import net mindview util *;