今天在昨天的基础上新增加了一些线程的知识,包括:线程的监听和线程的控制。
线程的监听即是在开始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
分享到:
相关推荐
基于Http协议的断点续传是Java多线程和线程安全的一个典型应用。下面详细解说一下这个实践的实现过程: 理解Http协议 在实现断点续传之前,我们需要先理解Http协议的基本工作原理。Http协议是一个基于请求-响应模式...
通过本毕业设计题目的研究和实践,学生可以深入理解Java多线程技术和线程安全机制,掌握Http协议的基本原理和应用方法,提高软件设计和开发能力。同时,学生还可以了解断点续传技术在实际应用中的重要性,以及如何...
Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 JSP将Java代码和...
内容索引:Delphi源码,系统相关,多线程,断点续传 一个使用Delphi多线程HTTP断点续传下载文件的示例程序,含源代码,运行程序如图示,模仿迅雷和快车的界面,实现了基本的断点续传下载功能。界面感觉挺不错,不过用到...
《android高级编程》首先简要介绍android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前android 1.0 sdk编写定制移动程序所需的知识,还...
1、数据采集基本功能 1)支持多任务、多线程数据采集,同时支持一个采集任务多个 多线程、高性能采集器爬虫.net版源码,可采ajax页面 实例运行,即将采集任务规则与采集任务运行进行剥离,方便采集任务的配置、...
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协议多线程下载和断点续...
算不上,基本满足应用开发的所有需求,代码很简洁,体积小,功能齐全。这就够了 基于主流网络框架 Retrofit2 OkHttp3 作为底层框架 使用 RxJava2 处理异步事件,线程间切换逻辑 使用 RxLifecycle2 管理生命周期,...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
ie8以下基本上不做兼容处理。chrome支持文件夹拖拽上传。 [文件打开] office文件在线预览功能,服务器必须在公网(外部能访问该服务器) [忘记密码] 修改data/system/member.php 密码为明文的md5值 例如将admin密码重...
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) 命令大全 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS...
根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...
\蔡志明首次引入Qt设计器的使用,绘制并实现了一个查找文件功能的部件,介绍了Qt应用程序中使用ui文件的基本方法以及Qt样式表;较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统...
《Android高级编程》首先简要介绍Android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前Android 1.0 SDK编写定制移动程序所需的知识,还能...