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

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

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

public class MyThread extends Thread {

public void run {

// некоторое долгое действие, вычисление

long sum=0;

for (int i=0; i<1000; i++) {

sum+=i;

}

System.out.println(sum);

}

}

Метод run содержит действия, которые должны выполняться в новом потоке исполнения. Чтобы запустить его, необходимо создать экземпляр класса-наследника и вызвать унаследованный метод start, который сообщает виртуальной машине, что требуется запустить новый поток исполнения и начать выполнять в нем метод run.

MyThread t = new MyThread;

t.start;

В результате чего на консоли появится результат:

499500

Когда метод run завершен (в частности, встретилось выражение return ), поток выполнения останавливается. Однако ничто не препятствует записи бесконечного цикла в этом методе. В результате поток не прервет своего исполнения и будет остановлен только при завершении работы всего приложения.

Интерфейс Runnable

Описанный подход имеет один недостаток. Поскольку в Java множественное наследование отсутствует, требование наследоваться от Thread может привести к конфликту. Если еще раз посмотреть на приведенный выше пример, станет понятно, что наследование производилось только с целью переопределения метода run. Поэтому предлагается более простой способ создать свой поток исполнения. Достаточно реализовать интерфейс Runnable, в котором объявлен только один метод – уже знакомый void run. Запишем пример, приведенный выше, с помощью этого интерфейса:

public class MyRunnable implements Runnable {

public void run {

// некоторое долгое действие, вычисление

long sum=0;

for (int i=0; i<1000; i++) {

sum+=i;

}

System.out.println(sum);

}

}

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

Runnable r = new MyRunnable;

Thread t = new Thread(r);

t.start;

Если раньше объект, представляющий сам поток выполнения, и объект с методом run, реализующим необходимую функциональность, были объединены в одном экземпляре класса MyThread, то теперь они разделены. Какой из двух подходов удобней, решается в каждом конкретном случае.

Подчеркнем, что Runnable не является полной заменой классу Thread, поскольку создание и запуск самого потока исполнения возможно только через метод Thread.start.

Работа с приоритетами

Рассмотрим, как в Java можно назначать потокам приоритеты. Для этого в классе Thread существуют методы getPriority и setPriority, а также объявлены три константы:

MIN_PRIORITY

MAX_PRIORITY

NORM_PRIORITY

Из названия понятно, что их значения описывают минимальное, максимальное и нормальное (по умолчанию) значения приоритета.

Рассмотрим следующий пример:

public class ThreadTest implements Runnable {

public void run {

double calc;

for (int i=0; i<50000; i++) {

calc=Math.sin(i*i);

if (i%10000==0) {

System.out.println(getName+ " counts " + i/10000);

}

}

}

public String getName {

return Thread.currentThread.getName;

}

public static void main(String s[]) {

// Подготовка потоков Thread t[] = new Thread[3];

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

t[i]=new Thread(new ThreadTest, "Thread "+i);

}

// Запуск потоков

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

t[i].start;

System.out.println(t[i].getName+ " started");

}

}

}

В примере используется несколько новых методов класса Thread:

* getName

Обратите внимание, что конструктору класса Thread передается два параметра. К реализации Runnable добавляется строка. Это имя потока, которое используется только для упрощения его идентификации. Имена нескольких потоков могут совпадать. Если его не задать, то Java генерирует простую строку вида "Thread-" и номер потока (вычисляется простым счетчиком). Именно это имя возвращается методом getName. Его можно сменить с помощью метода setName.

* currentThread

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

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

Thread 0 started

Thread 1 started

Thread 2 started

Thread 0 counts 0

Thread 1 counts 0

Thread 2 counts 0

Thread 0 counts 1

Thread 1 counts 1

Thread 2 counts 1

Thread 0 counts 2

Thread 2 counts 2

Thread 1 counts 2

Thread 2 counts 3

Thread 0 counts 3

Thread 1 counts 3

Thread 2 counts 4

Thread 0 counts 4

Thread 1 counts 4

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

Введем в программу работу с приоритетами, расставим разные значения для разных потоков и посмотрим, как это скажется на выполнении. Изменяется только метод main.

public static void main(String s[]) {

// Подготовка потоков

Thread t[] = new Thread[3];

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

t[i]=new Thread(new ThreadTest,

"Thread "+i);

t[i].setPriority(Thread.MIN_PRIORITY +

(Thread.MAX_PRIORITY -

Thread.MIN_PRIORITY)/t.length*i);

}

// Запуск потоков

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

t[i].start;

System.out.println(t[i].getName+

" started");

}

}

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

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Шайтан Иван 2

Тен Эдуард
2. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван 2

Двойник Короля 4

Скабер Артемий
4. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 4

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

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

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Деревенщина в Пекине

Афанасьев Семён
1. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине

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

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

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

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

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

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1