Java как центр архипелага | страница 14
Обычно поток, приостановленный с помощью метода suspend, возоб-
новляет работу посредством метода resume().
Вызов метода sleep() приводит к приостановке потока на заданное
число миллисекунд.
Вызов метода yeild() означает добровольную уступку процессора
другому потоку; первоначальный поток остается готовым к выпол-
нению.
Java-потоки обладают приоритетами. В спецификациях оговаривает-
ся, что Java-машина реализует вытесняющую многопотоковость. Это
означает, что поток с большим приоритетом может прервать выпол-
нение менее приоритетного потока. Однако, спецификации не тре-
буют наличия разделения времени. Это значит, что для передачи
управления потоку с тем же приоритетом, вообще говоря, требуют-
ся явные действия со стороны первоначального потока - вызов ме-
тодов suspend(), sleep() или yeild().
На рис. 10 представлена диаграмма состояний потоков.
Рис. 10. Диаграмма состояний потоков.
Следующий пример содержит фрагмент одного из многочисленных ва-
риантов решения задачи "производитель/потребитель". Он заимст-
вован из письма, которое написал Mark Tillotson в группу сете-
вых новостей comp.lang.java.
class my_producer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_producer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("producer to_do = " + items_to_do) ;
Integer item = new Integer (items_to_do*items_to_do) ;
the_buffer.insert (item) ;
items_to_do-- ;
}
System.out.println ("producer exiting") ;
}
}
Данный производитель помещает в буфер квадраты целых чисел.
В приведенном простом примере класс my_producer является нас-
ледником класса Thread, что делает его потоком с последователь-
ностью действий, заданной методом run(). В реальных программах,
как правило, об®ект должен наследовать у какого-либо предшест-
венника содержательные свойства, а возможность паралелльного
выполнения ему предоставляется интерфейсом ъunnable. Этот ин-
терфейс содержит единственный метод - run(). Пример.
1 class SomethingToъun extends Baseъunner implements ъunnable {
2 private Thread aThread;
3 public void run () {
// выполняемые действия
. . .
4 }
5 SomethingToъun () {
6 aThread = new Thread (this);
7 aTread.start ();
8 }
9 }
В строке 6 создается новый поток. Аргументом конструктора явля-