从静态到动态_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 从静态到动态

从静态到动态

 2014/8/12 21:26:51  殇瓶-MIN  程序员俱乐部  我要评论(0)
  • 摘要:从静态到动态在学习画图板的时候,我自己用了一段时间绘制出了一个小球,如若想使小球运动起来,正好可以将上篇博文说的线程类运用起来——在这里,我想让小球一直运行下去而不停止,并且能够手动的控制小球动作(暂停或者恢复运动)。/***重写Thread类的run方法*/publicvoidrun(){//绘制移动的球体while(true){//如果被暂停,一直循环执行休眠操作,不进行后面的移动操作if(pauseflag){continue;}//跳出线程的方法if(stopflag){return;
  • 标签:

?

class="p0">从静态到动态

?

在学习画图板的时候,我自己用了一段时间绘制出了一个小球,如若想使小球运动起来,正好可以将上篇博文说的线程类运用起来——在这里,我想让小球一直运行下去而不停止,并且能够手动的控制小球动作(暂停或者恢复运动)。?

?

/**
	 * 重写Thread类的run方法
	 */
	public void run() {
		// 绘制移动的球体
		while (true) {
			// 如果被暂停,一直循环执行休眠操作,不进行后面的移动操作
			if (pauseflag) {
				continue;
			}

			// 跳出线程的方法
			if (stopflag) {
				return;
			}

			// 设定横纵向的递增量的正负号
			if (y >= jp.getHeight() - size) {
				tempy = -Math.abs(tempy);
			} else if (y <= 37) {
				tempy = Math.abs(tempy);
			}
			if (x >= jp.getWidth() - size + 12) {
				tempx = -Math.abs(tempx);
			} else if (x <= 15) {
				tempx = Math.abs(tempx);
			}
			// 将上一个球体擦掉
			clear(x - size / 6 - 1, y - size / 6 - 1, size);
			// 改变球体的当前位置
			x += tempx;
			y += tempy;
			// 绘制当前球体
			ball(x, y, red, green, blue, size);

			// 休眠
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
	}

??

结果发现了这样一个问题,当点击“暂停”时,小球确实能够暂停,但是点击“继续”时,小球仍为暂停状态。经查阅书籍发现:每个线程都有一个独立的程序计数器(PC寄存器,当线程执行一个方法时,程序计数器指向方法区中下一条要执行的字节码指令)和方法调用栈(用来跟踪线程运行中一系列的方法调用过程,栈中元素称为栈帧——帧用来存储方法的参数、局部变量和运算过程中的临时数据)。也就是说,在监听器更改的值,是线程对象内存中的值,但是存储在线程中的变量pauseflag此时运用的是其寄存器中的值,因两者之间无交互,因而程序运行效果有些不同。

当我将代码改成如下状态时:

?

/**
	 * 重写Thread类的run方法
	 */
	public void run() {
		// 绘制移动的球体
		while (true) {
			// 休眠
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			// 如果被暂停,一直循环执行休眠操作,不进行后面的移动操作
			if (pauseflag) {
				continue;
			}

			// 跳出线程的方法
			if (stopflag) {
				return;
			}

			// 设定横纵向的递增量的正负号
			if (y >= jp.getHeight() - size) {
				tempy = -Math.abs(tempy);
			} else if (y <= 37) {
				tempy = Math.abs(tempy);
			}
			if (x >= jp.getWidth() - size + 12) {
				tempx = -Math.abs(tempx);
			} else if (x <= 15) {
				tempx = Math.abs(tempx);
			}
			// 将上一个球体擦掉
			clear(x - size / 6 - 1, y - size / 6 - 1, size);
			// 改变球体的当前位置
			x += tempx;
			y += tempy;
			// 绘制当前球体
			ball(x, y, red, green, blue, size);
		}
	}

?

在运行线程前将其暂停一会儿,等它再次启动的时候,数据之间又会进行交互,这样,小球的暂停与恢复(继续)就实现了。

?

?

?

?

  • 相关文章
发表评论
用户名: 匿名