Потоки в Java. Изучить возможности программирования потоков в языке Java

Страницы работы

Фрагмент текста работы

очередная банковская операция клиента происходит с задержкой на это время. Некоторые команды могут повлечь системные ошибки. JAVA требует такие команды охранять. Охрана состоит в применении конструкции try-catch.  То, что записывается в фигурных скобках после try- есть охраняемая последовательность команд. То, что записывается в фигурных скобках после catch- есть последовательность действий, выполняемая в случае возникновения системной ошибки. В примере – это выдача сообщения об ошибке на системную консоль : System.out.println(""+err);.

Теперь обратимся к классу Account:

class Account{

        static int balance=10000;

        static public void putmoney(int amount)

         {balance=balance+amount;}

         }

Этот класс имеет следующее назначение: в нем находится статическая переменная balance, содержащая текущий счет, а также метод для моделирования операций со счетом:

static public void putmoney(int amount)

         {balance=balance+amount;}

         }   .

Суть этого метода проста:он получает на входе сумму amount и добавляет ее к балансу balance.  Итак, запомним, что метод Account.putmoney вызывается из потока, имитирующего клиента, а не реализуется в самом потоке.

Остается отметить назначение самого апплета. Вот его окно после запуска:


На апплете размещена кнопка, нажатие на которую отображает текущее состояние счета клиента:


Событие от кнопки запрограммировано так:

public void actionPerformed(ActionEvent a_e)

      {

         summa=Account.balance;

         repaint();

         }

Переменной summa присваивается текущее значение переменной balance класса Account.Одновременно обратите внимание, как выполняется обращение к этой переменной. Завершающая команда – repaint() обязательна для перерисовки окна апплета. Команда repaint запускает метод paint().

Метод paint() выполняет отображение суммы:

public void paint(Graphics g)

    {   setBackground(Color.pink);

        g.setColor(Color.white);

        g.drawString("Your Account is:"+summa,100,100);}

     }

Обратите внимание на то, что аргумент "Your Account is:"+summa есть строка, хотя он получается путем присоединения к строке целого числа.

Наконец, приведем текст инициализации окна апплета:

public class myapplet extends Applet implements ActionListener{

   mythread myth=new mythread();

   int summa=0;

   Button btn=new Button("Press to know Account");

       public void init()

   {

        setLayout(null);

        add(btn);

        btn.setBounds(100,200,120,20);

        btn.addActionListener(this);

        myth.start();

}

Здесь следует обратить внимание на следующее. Первое. Объявление потока производится так:

mythread myth=new mythread();

Здесь mythread - это имя класса вашего потока (определено ранее). Переменная myth - это имя потока. Запуск потока на выполнение параллельно с основной программой реализуется в строке

myth.start();

Теперь объединим все рассмотреннные секции в единую программу:

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

public class myapplet extends Applet implements ActionListener{

mythread myth=new mythread();

int summa=0;

Button btn=new Button("Press to know Account");

public void init()

{

setLayout(null);

add(btn);

btn.setBounds(100,200,120,20);

btn.addActionListener(this);

myth.start();

}

public void actionPerformed(ActionEvent a_e)

{

summa=Account.balance;

repaint();

}

public void paint(Graphics g)

{   setBackground(Color.pink);

g.setColor(Color.white);

g.drawString("Your Account is:"+summa,100,100);}

}

class Account{

static int balance=10000;

static public void putmoney(int amount)

{balance=balance+amount;}

}

class mythread extends Thread{

int sum,i;

public void run()

{while(true)

{if (Math.random()>0.4)

{i=1;} else {i=-1;}

try{sleep(100);}

catch(Exception err)

{System.out.println(""+err);}

Account.putmoney((int) (i*Math.random()*100));

}

}

}

Пусть нам требуется перерисовывать окно апплета по инициативе не кнопки, а потока.  Для этого нужно динамически вызывать метод repaint() апплета.  Попытка написать вызов типа myapplet.repaint() либо myapplet.paint() приведут нас к неразрешимой проблеме, связанной с тем , что метод repaint объявлен как static. Запомните, что если метод объявлен как static ,то и все его переменные должны быть static.  Проблема состоит в том, что в вызове myapplet.repaint() myapplet есть имя класса (!) , а не объекта. А ссылки на класс всегда предполагают тип static.

Имеется иная возможность- породить апплет-поток, т.е. апплет, совмещающий в себе поток с его методами и главным методом – run. Рассмотрите тот же пример, но без кнопки:

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

public class myapplet2 extends Applet implements Runnable{

 Thread myth;

 int  i,summa=0;

       public void init()

   {    myth=new Thread(this);

        myth.start();

   }

        public void paint(Graphics g)

    {  

        setBackground(Color.pink);

        g.setColor(Color.white);

        g.drawString("Your Account is:"+summa,100,100);

     }

         public void run() { //**

         {while(true)

     {if (Math.random()>0.4)

           {i=1;} else {i=-1;}

     try{myth.sleep(1000);}

     catch(Exception err)

     {System.out.println(""+err);}

      summa=summa+((int) (i*Math.random()*100));

      repaint();

          }

         }

       }

    }

Поток myth ,созданный в апплете, имеет доступ к методу paint апплета и осуществляет его вызов в теле метода run:

public void run() {

         {while(true)

     {if (Math.random()>0.4)

           {i=1;} else {i=-1;}

     try{myth.sleep(1000);}

     catch(Exception err)

     {System.out.println(""+err);}

      summa=summa+((int) (i*Math.random()*100));

      repaint();

          }

         }

       }

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

ОПИСАНИЕ ЗАДАНИЯ НА ВЫПОЛНЕНИЕ.

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

1.  Поток инициирует появление в окне апплета в случайные моменты времени цветных кружков в различных местах экрана.

2.  Поток инициирует запись в окне апплета большими буквами текущей системной даты.

3.  Поток инициирует отображение бегущей строки.

4.  Напишите программу игры двух человек в спички. На экране отображается текущее число спичек в куче, например, 12. Игроки ходят по очереди. Когда игрок ходит, он нажимает кнопку (для каждого игрока – своя кнопка). Программа в процедуре actionPerformed распознает , кто ходит для определения победителя. Перед ходом игрок вводит в текстовом поле типа TextField число забираемых из кучи спичек:1,2 или 3. Проигрывает тот, перед ходом которого остается в куче 4 или менее спичек, но не менее

Похожие материалы

Информация о работе