今天在昨天的基础上新增加了一些线程的知识,包括:线程的监听和线程的控制。
线程的监听即是在开始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
分享到:
相关推荐
7. **设计模式**:可能用到的设计模式包括单例模式(为全局资源管理提供唯一入口)、工厂模式(创建线程对象)以及模板方法模式(定义线程的基本行为)等。 8. **源码分析**:这个项目包含73个子文件,意味着可能有...
创建线程有两种基本方式:继承Thread类并重写run()方法,或者实现Runnable接口并将其传递给Thread构造器。 在多线程环境下,线程安全是一个关键问题。线程安全意味着当多个线程访问一个对象时,不会出现数据不一致...
基于Http协议的断点续传是Java多线程和线程安全的一个典型应用。下面详细解说一下这个实践的实现过程: 理解Http协议 在实现断点续传之前,我们需要先理解Http协议的基本工作原理。Http协议是一个基于请求-响应模式...
通过本毕业设计题目的研究和实践,学生可以深入理解Java多线程技术和线程安全机制,掌握Http协议的基本原理和应用方法,提高软件设计和开发能力。同时,学生还可以了解断点续传技术在实际应用中的重要性,以及如何...
总结,这个毕业设计项目不仅涵盖了Java多线程编程的基本概念,还深入探讨了线程安全的实践策略,以及Http协议在实际应用中的操作。通过这个项目,开发者可以学习到如何在实际场景中运用这些知识,为后续的系统开发...
Java多线程与线程安全实践是计算机科学领域中的一个重要话题,特别是在开发高效并发应用程序时。本毕业论文设计深入探讨了如何在Java编程环境中利用多线程技术来实现基于Http协议的断点续传功能。这个项目涵盖了多个...
在实际应用中,为了提高下载速度,通常会将文件分割成多个部分并使用多个线程同时下载。这时,需要特别注意线程之间的同步问题,确保数据不会被错误地覆盖或丢失。一种常见的做法是为每个线程分配一个特定的文件区间...
创建新线程的基本步骤包括:定义一个包含线程执行逻辑的方法,然后创建`Thread`对象并传入该方法的引用。通过调用`Start()`方法启动线程,使其开始执行。多线程的应用场景广泛,如并行计算、UI更新和后台任务等。 ...
在Android开发中,多线程和断点续传下载是两个关键的技术点,它们极大地提升了应用程序的性能和用户体验。同时,结合在线播放音乐的功能,可以让应用程序变得更加丰富多彩。本压缩包"Android高级应用源码-Android多...
多线程下载的基本思路是将大文件分割成若干小块,每个线程负责下载其中的一块,最后再合并成完整的文件。 断点续传功能是通过保存下载进度来实现的。在下载过程中,工具会记录已下载的部分,当下载中断时,保存的...
下面我们将深入探讨如何在C/C++中实现线程断点续传,以及如何将其应用到Cocos2dx项目中。 首先,我们需要理解线程的基本概念。线程是操作系统分配CPU时间的基本单元,一个进程可以包含多个线程。在多线程环境下,...
断点续传的基本思想是在下载过程中记录已下载的文件部分,通常通过保存一个包含当前下载位置的文件元数据来实现。当下载中断后,下次启动下载时,服务会读取这个元数据,然后从上次停止的地方开始继续下载,而不是...
- 文件中提到了一些具体的例子,如Socket网络编程、多线程上载以及断点续传等场景下的多线程应用。 - 通过对这些具体案例的学习,可以更好地理解多线程编程的实际应用及其背后的原理。 综上所述,C#中的Timer类提供...