`
hwfantasy
  • 浏览: 20916 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

线程的基本应用--续

阅读更多
  今天在昨天的基础上新增加了一些线程的知识,包括:线程的监听和线程的控制。
  线程的监听即是在开始start()主要运行的线程之前,先开始一个监听的线程,类似鼠标监听器。在监听线程中可以设置小球间的碰撞。
  以下是程序代码:
  1.界面类中的代码
// 创建监听器对象(匿名内部类)
		ActionListener alis = new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String command = e.getActionCommand();
				// 启动监视线程
				BallListener blis = new BallListener(list,getUI());
				blis.start();
				if (command.equals("开始")) {
					panel.paint(g);
					Ball.initBall();
					// 创建一个小球对象
					Ball ball = new Ball(getUI());
					ball.start();
					list.add(ball);
					//将开始按钮设为 暂停
					jbu.setText("暂停");
				}
            }
}

  2.线程监听类
public class BallListener extends Thread {

	// 创建队列以存放小球对象
	ArrayList<Ball> alis;
	// 得到的画布对象
	Graphics g;
	BallUI ballui;

	/**
	 * 构造方法
	 * 
	 * @param alis
	 *            传入存放小球的队列对象
	 */
	public BallListener(ArrayList<Ball> alis,BallUI ballui) {
		this.alis = alis;
		this.ballui = ballui;
		
		// 由窗体对象得到画布对象
		g = ballui.panel.getGraphics();
	}

	public void run() {
		while (!Ball.isStop) {
			while (!Ball.isPause) {
				//依次比较两个小球对象
				for (int i = 0; i < alis.size() ; i++) {
					for(int j = i+1; j< alis.size() ; j++){
						Ball b = alis.get(i);
						Ball b1 = alis.get(j);
						double distance =Math.hypot( ((b.x+b.size/2)-(b1.x+b1.size/2)),((b.y+b.size/2)-(b1.y+b1.size/2)));
						if(distance <= b.size){
							int tempx,tempy;
							tempx = b.x;
							b.x = b1.x;
							b1.x = tempx;
							tempy = b.y;
							b.y = b1.y;
							b1.y = tempy;
							// 擦除球
							g.setColor(ballui.panel.getBackground());
							g.fillOval(b.x, b.y, b.size, b.size);
							g.fillOval(b1.x, b1.y, b1.size, b1.size);
//							g.setColor(Color.BLACK);
//							g.fillOval(b.x = b.x + b.dx, b.y = b.y + b.dy, b.size, b.size);
//							g.fillOval(b1.x = b1.x + b1.dx, b1.y = b1.y + b1.dy, b.size, b.size);
							
						}
					}
				}
				try {
					Thread.sleep(10);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			try {
				Thread.sleep(10);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		}
	}
}

  线程的控制即是改变while语句的判断条件的变量,并且在监听器类中用方法改变这些变量,以达到控制的目的。
 
public void move() {
		while (!isStop) {
			while (!isPause) {
				// 擦除球
				g.setColor(ballui.panel.getBackground());
				g.fillOval(x, y, size, size);
				// 画球
				g.setColor(Color.BLACK);
				if ((x < (425-size) && x > 0) && (y > 0 && y < (400-size))) {// 如果球未碰边
					g.fillOval(x = x + dx, y = y + dy, 30, 30);
				} else if (!(x < (425-size) && x > 0) && !(y > 0 && y < (400-size))) {// 如果球同时碰2两条边
					dx = -dx;
					dy = -dy;
					g.fillOval(x = x + dx, y = y + dy, 30, 30);
				} else if ((x < (425-size) && x > 0) && !(y > 0 && y < (400-size))) {// 如果球碰竖边
					dy = -dy;
					g.fillOval(x = x + dx, y = y + dy, 30, 30);
				} else if (!(x < (425-size) && x > 0) && (y > 0 && y < (400-size))) {// 如果球碰横边
					dx = -dx;
					g.fillOval(x = x + dx, y = y + dy, 30, 30);
				}
				try {
					sleep(20);
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			try {
				Thread.sleep(1);// 沉睡时间,暂停时的休眠
			} catch (Exception ef) {
				ef.printStackTrace();
			}
		}
	}

/**
	 * 暂停线程的方法
	 */
	public static void pauseThread() {
		isPause = true;
	}

	/**
	 * 继续线程的方法
	 */
	public static void resumeThread() {
		isPause = false;
	}

	/**
	 * 停止线程的方法
	 */
	public static void stopThread() {
		isPause = true;
		isStop = true;
	}

	/**
	 * 初始化线程的方法
	 */
	public static void initBall() {
		isPause = false;
		isStop = false;
	}

此程序的运行图

  • 大小: 21.8 KB
分享到:
评论

相关推荐

    Java多线程与线程安全实践-基于Http协议的断点续传

    基于Http协议的断点续传是Java多线程和线程安全的一个典型应用。下面详细解说一下这个实践的实现过程: 理解Http协议 在实现断点续传之前,我们需要先理解Http协议的基本工作原理。Http协议是一个基于请求-响应模式...

    Java多线程与线程安全实践-基于Http协议的断点续传(源码)

    通过本毕业设计题目的研究和实践,学生可以深入理解Java多线程技术和线程安全机制,掌握Http协议的基本原理和应用方法,提高软件设计和开发能力。同时,学生还可以了解断点续传技术在实际应用中的重要性,以及如何...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 JSP将Java代码和...

    Delphi利用多线程HTTP断点续传下载示例

    内容索引:Delphi源码,系统相关,多线程,断点续传 一个使用Delphi多线程HTTP断点续传下载文件的示例程序,含源代码,运行程序如图示,模仿迅雷和快车的界面,实现了基本的断点续传下载功能。界面感觉挺不错,不过用到...

    Android高级编程--源代码

     《android高级编程》首先简要介绍android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前android 1.0 sdk编写定制移动程序所需的知识,还...

    多线程、高性能采集器爬虫.net版源码,可采ajax页面

    1、数据采集基本功能 1)支持多任务、多线程数据采集,同时支持一个采集任务多个 多线程、高性能采集器爬虫.net版源码,可采ajax页面 实例运行,即将采集任务规则与采集任务运行进行剥离,方便采集任务的配置、...

    Windows应用程序捆绑核心编程光盘代码

    13.2.3 FTP协议多线程下载和断点续传的实现 295 13.2.4 实例 306 13.3 使用HTTP进行多线程下载和断点续传 307 13.3.1 HTTP协议简介 307 13.3.2 HTTP协议的内部操作过程 308 13.3.3 HTTP协议多线程下载和断点续...

    Android代码-Rx-Mvp

    算不上,基本满足应用开发的所有需求,代码很简洁,体积小,功能齐全。这就够了 基于主流网络框架 Retrofit2 OkHttp3 作为底层框架 使用 RxJava2 处理异步事件,线程间切换逻辑 使用 RxLifecycle2 管理生命周期,...

    vc++ 开发实例源码包

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    vc++ 应用源码包_1

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    vc++ 应用源码包_2

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    vc++ 应用源码包_6

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    vc++ 应用源码包_5

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    vc++ 应用源码包_3

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    KODExplorer 芒果云-资源管理器

    ie8以下基本上不做兼容处理。chrome支持文件夹拖拽上传。 [文件打开] office文件在线预览功能,服务器必须在公网(外部能访问该服务器) [忘记密码] 修改data/system/member.php 密码为明文的md5值 例如将admin密码重...

    cmd操作命令和linux命令大全收集

    CMD命令:开始-&gt;运行-&gt;键入cmd或command(在命令行里可以看到系统版本、文件系统版本) 命令大全 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS...

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

    精通Qt4编程(第二版)源代码

    \蔡志明首次引入Qt设计器的使用,绘制并实现了一个查找文件功能的部件,介绍了Qt应用程序中使用ui文件的基本方法以及Qt样式表;较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统...

    《Android高级编程》

    《Android高级编程》首先简要介绍Android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前Android 1.0 SDK编写定制移动程序所需的知识,还能...

Global site tag (gtag.js) - Google Analytics