Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

}

} /// -

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

//: concurrency/DaemonFromFactory java

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

import java.util.concurrent.*;

import net mindview util *;

import static net.mindview.util.Print.*,

public class DaemonFromFactory implements Runnable { public void run { try {

while(true) {

TimeUnit MILLISECONDS.sleep(lOO); print(Thread.currentThread + " " + this);

}

} catch(InterruptedException e) { print("Interrupted");

}

}

public static void main(String[] args) throws Exception {

ExecutorService exec = Executors newCachedThreadPool(

new DaemonThreadFactory), for(int i = 0; i < 10. i++)

exec.execute(new DaemonFromFactory); printC'Bce

демоны запущены"); TimeUnit MILLISECONDS.sleep(500); // Задержка

}

} /// ~

Каждый статический метод создания ExecutorService перегружается для получения объекта ThreadFactory, который будет использоваться для создания новых потоков.

Сделаем еще один шаг — создадим вспомогательный класс DaemonThread-PoolExecutor:

// net/mi ndvi ew/uti1/DaemonThreadPoolExecutor.java package net mindview.util; import java util.concurrent *;

public class DaemonThreadPoolExecutor extends ThreadPoolExecutor {

public DaemonThreadPoolExecutorО {

super(0, Integer MAX_VALUE. 60L. TimeUnit SECONDS.

new SynchronousQueue<Runnable>. продолжение &

new DaemonThreadFactoryO).

}

} /// ~

Чтобы узнать, какие значения должны передаваться при вызове конструктора базового класса, я просто заглянул в исходный код Executors.java.

Чтобы узнать, является ли поток демоном, вызовите метод isDaemon. Если поток является демоном, то все потоки, которые он производит, также будут демонами, что и демонстрируется следующим примером:

//: concurrency/Daemons.java

// Потоки, порождаемые демонами, также являются демонами

import java util.concurrent.*,

import static net mindview util Print.*,

class Daemon implements Runnable {

private Thread[] t = new Thread[10]; public void run {

for(int i = 0; i < t length; i++) {

t[i] = new Thread (new DaemonSpawnO); t[i].startO:

printnb("DaemonSpawn " + i + " started. ");

}

for(int i = 0. i < t.length, i++)

printnb("t[" + i + "]. isDaemonO = " + t[i] isDaemonO + ");

while(true)

Thread.yieldO;

class DaemonSpawn implements Runnable { public void run { while(true)

Thread.yieldO;

public class Daemons {

public static void main(String[] args) throws Exception { Thread d = new Thread(new DaemonO); d.setDaemon(true); d.startO;

printnbC'd.isDaemonO = " + d.isDaemonO + ". "); // Даем

потокам-демонам завершить процесс запуска: TimeUnit.SECONDS.sleep(l);

}

} /* Output:

d.isDaemonO = true, DaemonSpawn 0 started, DaemonSpawn 1 started. DaemonSpawn 2 started. DaemonSpawn 3 started. DaemonSpawn 4 started. DaemonSpawn 5 started. DaemonSpawn 6 started, DaemonSpawn 7 started, DaemonSpawn 8 started. DaemonSpawn 9 started. t[0].isDaemonO = true. t[l] isDaemonO = true, t[2].isDaemonO = true, t[3].isDaemonO = true. t[4].isDaemonO = true. t[5].isDaemonO = true. t[6].isDaemonO = true. t[7].isDaemonO = true. t[8].isDaemonO = true. t[9].isDaemonO = true. *///:-

Поток Daemon переводится в режим демона, а затем порождает группу новых потоков, которые явно не назначаются демонами, но при этом все равно оказываются ими. Затем Daemon входит в бесконечный цикл, на каждом шаге которого вызывается метод yield, передающий управление другими процессам.

Учтите, что потоки-демоны завершают свои методы run без выполнения секций finally:

//: concurrency/DaemonsDontRunFinally.java

// Потоки-демоны не выполняют секцию finally.

import java.util.concurrent.*.

import static net.mindview.util.Print.*,

class ADaemon implements Runnable { public void run { try {

print("Запускаем ADaemon"); TimeUnit.SECONDS.sieep(l). } catch(InterruptedException e) {

print("Выход через InterruptedException"); } finally {

print("Должно выполняться всегда?");

}

}

}

public class DaemonsDontRunFinally {

public static void main(String[] args) throws Exception { Thread t = new Thread(new ADaemonO); t.setDaemon(true). t.startO,

}

} /* Output;

Запускаем ADaemon

*///:-

Запуск программы наглядно показывает, что секция finally не выполняется. С другой стороны, если закомментировать вызов setDaemon, вы увидите, что секция finally была выполнена.

Такое поведение верно, даже если из предыдущих описаний finally у вас сложилось обратное впечатление. Демоны завершаются «внезапно», при завершении последнего не-демона. Таким образом, сразу же при выходе из main JVM немедленно прерывает работу всех демонов, не соблюдая никакие формальности. Невозможность корректного завершения демонов ограничивает возможности их применения. Обычно объекты Executor оказываются более удачным решением, потому что все задачи, находящиеся под управлением Executor, могут быть завершены одновременно.

Варианты кодирования

Во всех предшествующих примерах все классы задач реализовали интерфейс Runnable. В очень простых случаях можно использовать альтернативное решение с прямым наследованием от Thread:

//• concurrency/SimpleThread.java // Прямое наследование от класса Thread.

public class SimpleThread extends Thread { private int countDown = 5; private static int threadCount = 0. public SimpleThreadO {

// Сохранение имени потока

super(Integer.toStri ng(++threadCount)).

Поделиться:
Популярные книги

Город Бездны

Рейнольдс Аластер
1. Космический апокалипсис
Фантастика:
научная фантастика
космическая фантастика
6.71
рейтинг книги
Город Бездны

Битва за небеса

Калашников Максим
Великие противостояния
Фантастика:
альтернативная история
4.67
рейтинг книги
Битва за небеса

Полное собрание сочинений в одной книге

Зощенко Михаил Михайлович
Проза:
классическая проза
русская классическая проза
советская классическая проза
6.25
рейтинг книги
Полное собрание сочинений в одной книге

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Битва в пути

Николаева Галина
Проза:
советская классическая проза
6.60
рейтинг книги
Битва в пути

Газлайтер. Том 3

Володин Григорий Григорьевич
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Основные произведения иностранной художественной литературы. Азия. Африка

Коллектив авторов
Научно-образовательная:
языкознание
литературоведение
5.00
рейтинг книги
Основные произведения иностранной художественной литературы. Азия. Африка

Том 10. Мертвое озеро

Некрасов Николай Алексеевич
10. Собрание сочинений в пятнадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 10. Мертвое озеро

Архивариус

alchoz
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Архивариус

Королевский казначей

Костейн Томас
Приключения:
исторические приключения
6.00
рейтинг книги
Королевский казначей

Газлайтер. Том 2

Володин Григорий Григорьевич
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Кентерберийские рассказы

Чосер Джеффри
Старинная литература:
европейская старинная литература
8.00
рейтинг книги
Кентерберийские рассказы

История политических и правовых учений. Учебник

Коллектив авторов
Научно-образовательная:
история
юриспруденция
5.00
рейтинг книги
История политических и правовых учений. Учебник

AutoCAD 2008. Руководство пользователя

Autodesk
Справочная литература:
руководства
5.00
рейтинг книги
AutoCAD 2008. Руководство пользователя