`
hwfantasy
  • 浏览: 21575 次
  • 性别: 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协议的断点续传.zip

    7. **设计模式**:可能用到的设计模式包括单例模式(为全局资源管理提供唯一入口)、工厂模式(创建线程对象)以及模板方法模式(定义线程的基本行为)等。 8. **源码分析**:这个项目包含73个子文件,意味着可能有...

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

    创建线程有两种基本方式:继承Thread类并重写run()方法,或者实现Runnable接口并将其传递给Thread构造器。 在多线程环境下,线程安全是一个关键问题。线程安全意味着当多个线程访问一个对象时,不会出现数据不一致...

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

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

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

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

    大学毕业设计Java多线程与线程安全实践-基于Http协议的断点续传.zip

    总结,这个毕业设计项目不仅涵盖了Java多线程编程的基本概念,还深入探讨了线程安全的实践策略,以及Http协议在实际应用中的操作。通过这个项目,开发者可以学习到如何在实际场景中运用这些知识,为后续的系统开发...

    毕业论文设计-IT计算机-Java多线程与线程安全实践-基于Http协议的断点续传.zip

    Java多线程与线程安全实践是计算机科学领域中的一个重要话题,特别是在开发高效并发应用程序时。本毕业论文设计深入探讨了如何在Java编程环境中利用多线程技术来实现基于Http协议的断点续传功能。这个项目涵盖了多个...

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

    在实际应用中,为了提高下载速度,通常会将文件分割成多个部分并使用多个线程同时下载。这时,需要特别注意线程之间的同步问题,确保数据不会被错误地覆盖或丢失。一种常见的做法是为每个线程分配一个特定的文件区间...

    c#多线程断点续传

    创建新线程的基本步骤包括:定义一个包含线程执行逻辑的方法,然后创建`Thread`对象并传入该方法的引用。通过调用`Start()`方法启动线程,使其开始执行。多线程的应用场景广泛,如并行计算、UI更新和后台任务等。 ...

    Android高级应用源码-Android多线程断点续传下载+在线播放音乐.zip

    在Android开发中,多线程和断点续传下载是两个关键的技术点,它们极大地提升了应用程序的性能和用户体验。同时,结合在线播放音乐的功能,可以让应用程序变得更加丰富多彩。本压缩包"Android高级应用源码-Android多...

    Python-HTTP大文件多线程下载工具支持断点续传

    多线程下载的基本思路是将大文件分割成若干小块,每个线程负责下载其中的一块,最后再合并成完整的文件。 断点续传功能是通过保存下载进度来实现的。在下载过程中,工具会记录已下载的部分,当下载中断时,保存的...

    c/c++线程断点续传实现

    下面我们将深入探讨如何在C/C++中实现线程断点续传,以及如何将其应用到Cocos2dx项目中。 首先,我们需要理解线程的基本概念。线程是操作系统分配CPU时间的基本单元,一个进程可以包含多个线程。在多线程环境下,...

    单线程断点续传

    断点续传的基本思想是在下载过程中记录已下载的文件部分,通常通过保存一个包含当前下载位置的文件元数据来实现。当下载中断后,下次启动下载时,服务会读取这个元数据,然后从上次停止的地方开始继续下载,而不是...

    C#timer及多线程编程

    - 文件中提到了一些具体的例子,如Socket网络编程、多线程上载以及断点续传等场景下的多线程应用。 - 通过对这些具体案例的学习,可以更好地理解多线程编程的实际应用及其背后的原理。 综上所述,C#中的Timer类提供...

Global site tag (gtag.js) - Google Analytics