1.线程的监听模式.
由于每个线程都是由一个对象去实现的,所以当我们想要监听这些线程的时候,只需要将每个对象里的重要数据拿出来处理.所以,通常可以将这些对象放入一个队列中去,然后再将这个队列直接传给监听线程,而在监听线程中,我们又可以再将其有用的数据取出,完成某些特定的功能.当然,首先要保证的是监听线程是在要被监听线程之前被启用..
// 匿名内部类
ActionListener l = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("开始")) {
// 监听线程
Listener l = new Listener(list); // list是存放Ball对象的队列
l.start();
// 创建小球线程
Ball b = new Ball(jp, x);
list.add(b);// 将线程存入队列中
b.start();
}
}
};
2.线程的控制.
昨天已经知道.为了使这个线程能一直持续的运行下去 , 通常会让run方法进入到一个死循环中...
但如果我们要让这个线程结束呢 ?
本来JDk中是有个stop方法的,能够强行关掉一个线程,但是由于它的不安全性,所以通常不采用这个方法来结束一个线程.而又因为只要run方法中的代码都执行完,这个线程便会停止,因此.我们只要能够改变run方法中的死循环中的被判断条件的状态.当这个循环不再是一个死循环,而是一个可以执行完的循环时,, 那么,只要这个这些代码都执行完,这个线程也自然就停止活动了..
while (!isStop) {//isStop初始值为false
while (!isPause) {//isPause初始值为false
// 清除图像
// 设置颜色为窗体的背景色
g.setColor(bu.getContentPane().getBackground());
g.fillOval(x0, y0, 30, 30);
g.setColor(Color.BLUE);
// 在内部类中使用外部的变量,必须定义成final
g.fillOval(x0 += x, y0 += y, 30, 30);
try {
Thread.sleep(1000);// 沉睡时间,球移动位置的时间间隔
} catch (Exception ef) {
ef.printStackTrace();
}
}
try {
Thread.sleep(1);// 沉睡时间,暂停时的休眠
} catch (Exception ef) {
ef.printStackTrace();
}
}
这样,便可以通过修改isStop以及isPause的值来改变这个循环的状态
/**
* 暂停线程的方法
*/
public static void pauseThread() {
isPause = true;
}
/**
* 继续线程的方法
*/
public static void resumeThread() {
isPause = false;
}
/**
* 停止线程的方法
*/
public static void stopThread() {
isPause = true;
isStop = true;
}
可以通过将这写方法在各个按钮的监听器中使用,, 从而改变条件式的真值,进而影响循环的状态,达到停止一个不再需要的线程的目的...