Читаем Философия Java3 полностью

// Используем анонимную реализацию Runnable-class InnerRunnable2 {

private int countDown = 5;

private Thread t;

public InnerRunnable2(String name) {

t = new Thread(new RunnableO { public void run() { try {

while(true) {

print(this);

if(--countDown == 0) return; Ti mellnit. MI LLISECONDS. s 1 eep( 10);

}

} catchdnterruptedException e) {

printCsleepO interrupted");

}

}

public String toStringO {

return Thread.currentThreadO.getNameO + ": " + countDown;

}

}. name); t.startO;

}

}

// Отдельный метод для выполнения кода в потоке: class ThreadMethod {

private int countDown = 5; private Thread t; private String name;

public ThreadMethodCString name) { this.name = name; } public void runTaskO { if(t == null) {

t = new Thread(name) {

public void run() { try {

while(true) {

print(this);

if(--countDown == 0) return; sleep(lO);

}

} catchdnterruptedException e) {

printCsleepO interrupted");

}

}

public String toStringO {

return getNameO + ": " + countDown;

}

}:

t.startO;

}

}

}

public class ThreadVariations {

public static void main(String[] args) { new InnerThreadlCInnerThreadl") ; new InnerThread2("InnerThread2"); new InnerRunnablelCInnerRunnablel");

new InnerRunnable2("InnerRunnable2"); продолжение &

new ThreadMethodC'ThreadMethod") runTaskO,

}

} ///-

InnerThreadl определяет именованный внутренний класс, производный от Thread, и создает экземпляр этого класса в конструкторе. Поступать так стоит в том случае, когда у внутреннего класса есть особые возможности (новые методы), которые могут понадобиться в других методах. Однако в большинстве случаев причина создания потока — использование функциональности класса Thread, поэтому в именованном внутреннем классе особой нужды нет. Inner-Thread2 показывает другое решение. В конструкторе создается безымянный внутренний субкласс Thread, преобразуемый восходящим преобразованием к ссылке на Thread t. Если другим методам класса понадобится обратиться к t, они смогут сделать это через интерфейс Thread, и им не нужно будет знать точный тип объекта.

Третий и четвертый классы примера повторяют первые два, только вместо класса Thread они используют интерфейс Runnable.

Класс ThreadMethod демонстрирует создание потока в методе. Вы вызываете метод, когда программа готова к запуску потока, а метод возвращает управление после запуска потока. Если поток выполняет только вспомогательные операции и не является фундаментальной частью класса, то этот способ, вероятно, удобнее и практичнее запуска потока из конструктора класса.

Присоединение к потоку

Любой поток может вызвать метод join(), чтобы дождаться завершения другого потока перед своим продолжением. Если поток вызывает t.join() для другого потока t, то вызывающий поток приостанавливается до тех пор, пока целевой поток t не завершит свою работу (когда метод t.isAlive() вернет значение false).

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

Вызов join() может быть прерван вызовом метода interrupt() для потока-инициатора, поэтому потребуется блок try-catch.

Все эти операции продемонстрированы в следующем примере:

// concurrency/Joining java

// Демонстрация joinO.

import static net mindview util Print *;

class Sleeper extends Thread {

private int duration,

public Sleeper(String name, int sleepTime) { super(name), duration = sleepTime, startO,

}

public void run О {

try {

sleep(duration), } catchdnterruptedException e) {

print(getName() + " прерван " +

"isInterruptedO• " + islnterrupted()),

return;

}

print(getName() + " активизировался"),

}

}

class Joiner extends Thread { private Sleeper sleeper, public Joiner(String name. Sleeper sleeper) { super(name), this.sleeper = sleeper. startO;

}

public void runO { try {

sleeper joinO; } catchdnterruptedException e) { print("Прерван");

}

print (getNameO + " join завершен");

public class Joining {

public static void main(String[] args) { Sleeper

sleepy = new Sleeper("Sleepy". 1500), grumpy = new SIeeper("Grumpy". 1500).

Joiner

dopey = new Joiner("Dopey", sleepy), doc = new Joiner("Doc", grumpy); grumpy interruptO;

}

} /* Output-

Grumpy был прерван. isInterruptedO. false Doc join завершен Sleepy активизировался Dopey join завершен *///;-

Класс Sleeper — это тип потока, который приостанавливается на время, указанное в его конструкторе. В методе run() вызов метода sleep() может закончиться по истечении времени задержки, но может и прерваться. В секции catch выводится сообщение о прерывании, вместе со значением, возвращаемым методом islnterrupted(). Когда другой поток вызывает interrupt() для данного потока, устанавливается флаг, показывающий, что поток был прерван. Однако этот флаг сбрасывается при обработке исключения, поэтому внутри секции catch результатом всегда будет false. Флаг используется в других ситуациях, где поток может исследовать свое прерванное состояние в стороне от исключения.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных