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 создается новый поток. Аргументом конструктора явля-