очередная банковская операция клиента происходит с задержкой на это время. Некоторые команды могут повлечь системные ошибки. 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 или менее спичек, но не менее
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.