线程初步了解2

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;
	}

 

 

可以通过将这写方法在各个按钮的监听器中使用,, 从而改变条件式的真值,进而影响循环的状态,达到停止一个不再需要的线程的目的...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值