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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

startO.

}

public String toStringO {

return "#" + getNameO + "(" + countDown + "), ";

}

public void run {

while(true) {

System out print(this). if(--countDown == 0) return,

}

}

public static void main(String[] args) { for(int i = 0, i < 5, i++) new SimpleThreadO.

}

} /* Output

#1(5). #1(4). #1(3). #1(2). #1(1). #2(5). #2(4). #2(3). #2(2). #2(1). #3(5). #3(4). #3(3). #3(2). #3(1). #4(5). #4(4), #4(3). #4(2). #4(1). #5(5). #5(4). #5(3). #5(2). #5(1).

Чтобы задать объектам Thread имена, вы вызываете соответствующий конструктор Thread. Имя читается в методе toStringO при помощи getName.

Также иногда встречается идиома самоуправляемой реализации Runnable:

// concurrency/SelfManaged.java

// Реализация Runnable. содержащая собственый объект Thread

public class SelfManaged implements Runnable { private int countDown = 5. private Thread t = new Thread(this). public SelfManagedO { t startO. } public String toStringO {

return Thread currentThreadO .getNameO + "(" + countDown + "). ";

}

public void run {

while(true) {

System out print(this). if(--countDown == 0) return.

}

}

public static void main(Stnng[] args) { for(int i = 0. i < 5. i++) new SelfManagedO,

}

Thread-0(5) Thread-1(4) Thread-2(3) Thread-3(2) Thread-4(1) */// ~

В целом происходящее не так уж сильно отличается от наследования от Thread, разве что синтаксис получается чуть более громоздким. Однако реализация интерфейса позволяет наследовать от другого класса, тогда как в варианте с Thread это невозможно.

Обратите внимание на вызов start в конструкторе. Приведенный пример очень прост, поэтому, скорее всего, в нем такое решение безопасно, но вы должны знать, что запуск потоков в конструкторе может создать изрядные проблемы — до завершения конструктора может быть запущена на выполнение другая задача, которая обратится к объекту в нестабильном состоянии. Это еще одна причина, по которой использование Executor предпочтительнее явного создания объектов Thread.

Иногда бывает разумно спрятать потоковый код внутри класса с помощью внутреннего класса, как показано здесь:

// concurrency/ThreadVariations java

// Создание потоков с использованием внутренних классов.

import java.util.concurrent.*,

import static net mindview.util.Print.*;

// Используем именованный внутренний класс, class InnerThreadl {

private int countDown = 5; private Inner inner, private class Inner extends Thread { Inner(String name) { super(name); startO,

}

public void run { try {

while(true) {

print(this);

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

}

} catchdnterruptedException e) { »print("interrupted"):

}

}

public String toStringO {

return getNameO + ": " + countDown;

>

}

public InnerThreadKString name) { inner = new Inner(name);

Thread-0(4), Thread-КЗ), Thread-2(2), Thread-3(1),

Thread-1(5). Thread-2(4). Thread-3(3). Thread-4(2).

Thread-0(3), Thread-1(2), Thread-2(1), Thread-4(5),

Thread-0(2). Thread-Id). Thread-3(5). Thread-4(4),

Thread-Od). Thread-2(5). Thread-3(4), Thread-4(3).

// Используем безымянный внутренний класс: class InnerThread2 {

private int countDown = 5; private Thread t;

public InnerThread2(String name) { t = new Thread(name) {

public void run { try {

while(true) {

print(this).

if(--countDown == 0) return, sleep(lO).

}

} catch(InterruptedException e) {

printCsleepO interrupted");

}

}

public String toStringO {

return getNameO + ". " + countDown;

}

}:

t startO;

}

}

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

private int countDown = 5; private Inner inner,

private class Inner implements Runnable { Thread t;

Inner(String name) {

t = new Thread(this. name); t.startO;

}

public void runO { try {

while(true) {

print(this);

if(--countDown == 0) return; Ti mellnit .MILLISECONDS. si eep( 10);

}

} catch(InterruptedException e) {

printCsleepO interrupted");

}

}

public String toStringO {

return t.getNameO + ". " + countDown;

}

}

public InnerRunnableKString name) { inner = new Inner(name),

// Используем анонимную реализацию 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;

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

Личный аптекарь императора. Том 3

Карелин Сергей Витальевич
3. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 3

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Мачеха Золушки - попаданка

Максонова Мария
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Мачеха Золушки - попаданка

Сирийский рубеж 2

Дорин Михаил
6. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж 2

Законник Российской Империи. Том 4

Ткачев Андрей Юрьевич
4. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 4

Старый, но крепкий 7

Крынов Макс
7. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Бастард

Майерс Александр
1. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард

Вернувшийся: Корпорация. Том III

Vector
3. Вернувшийся
Фантастика:
космическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Корпорация. Том III

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

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

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

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6