//DeadClass2.java
//
//2009-11-22
//<applet code=DeadClass4 width=200 height=100>
//</applet>
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class DeadClass4 extends JApplet
{
int count1=0;//decreaseT和increaseT是两个不同的线程,将两变量放在线
//程外,才能达到求绝对值的效果。
int count2=0;
JTextField txt1=new JTextField(5);
JTextField txt2=new JTextField(5);
JTextField txt3=new JTextField(14);
JButton increase=new JButton("Increase");
JButton decrease=new JButton("Decrease");
class ThreadClass extends Thread
{
int count;
boolean flag;
public void run(){
while (true)
{
if (flag)
{
txt2.setText(Integer.toString(count1++));
}
else
txt1.setText(Integer.toString(count2--));
try
{
sleep(1000);
}
catch (InterruptedException e){}
txt3.setText("count1+count2= "+Integer.toString(count1+count2));
}
}
}
ThreadClass increaseT;
ThreadClass decreaseT;
class IncreaseButtonLis implements ActionListener
{
public void actionPerformed(ActionEvent e){
if (increaseT==null)
{
increaseT=new ThreadClass();
increaseT.flag=true;
increaseT.start();
}
}
}
class DecreaseButtonLis implements ActionListener
{
public void actionPerformed(ActionEvent e){
if (decreaseT==null)
{
decreaseT=new ThreadClass();
decreaseT.flag=false;
decreaseT.start();
}
}
}
public void init(){
Container cp=getContentPane();
cp.setLayout(new FlowLayout());
cp.add(txt1);
cp.add(txt2);
cp.add(txt3);
cp.add(increase);
cp.add(decrease);
increase.addActionListener(new IncreaseButtonLis());
decrease.addActionListener(new DecreaseButtonLis());
}
}
程序最重要的改动不是增加了一个计算 count1 和 count2 变量绝对值之差的功能,而是
把这两个变量的声明放在了线程类之外。
因为 addThread 和 subThread 线程是两个不同的对象,如果这两个变量在内部类中,那
么 addThread线程中的 count1+count2 相当于:
addThread.count1+addThread.count2
前者虽然在累加,但是后者永远为0。
subThread线程中的 count1+count2 相当于:
subThread.count1+subThreadcount2
后者虽然在累减,但是前者永远为0。
如果变量在外部类中,那么两个线程中的 count1 和 count2 就是同一变量。