`

java线程和进程(运用多线程的小球碰撞游戏)

阅读更多

进程是什么?在我的理解中,进程就是程序执行的一个实例,比如说你运行了十个ie,那么就有10个独立的ie进程,另外,如果你打开windows系统的任务管理器,在进程标签下显示的就是当前系统运行的进程。每个进程都有自己的一块内存空间,和一系列的系统资源,其数据和状态完全独立。

线程是什么?线程是进程中的一个实体,自己不占用系统资源,但其与所属进程的其他线程共享进程所拥有的全部资源。线程本身的数据只有cpu的寄存器数据。

 

java中线程的实现:

1.定义一个线程类,继承Threads类并重写run方法;

2.定义一个类,实现Runnable接口,重写目标对象从Runnable得到的run()方法。

线程的状态:

1.创建状态:Thread thread = new Thread();注意:此时系统并不为它分配资源,它只是一个空的线程对象;

2.运行状态:thread.start();

3.不可运行状态:由于某种原因导致线程无法继续运行,调用了wait、sleep、suspend方法或发生了线程阻塞,出现等待状态;

4.死亡状态:1.线程执行完毕,自然销毁;2.线程调用了stop方法

 

以下是运用线程编写的小球碰撞程序,其中小球类继承了Thread类。

主界面类:

 

package cn.lzj0801;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 小球主界面,继承了JFrame类
 * 
 * @author lzj
 * 
 */
public class BallFrame extends JFrame {
	public static void main(String[] args) {
		BallFrame df = new BallFrame();// 創建DrawFrame對象
		df.iniUI();// 調用iniUI方法

	}

	public void iniUI() {
		this.setTitle("线程入门");
		this.setSize(700, 700);
		this.setResizable(false);// 设置窗体大小不可改变
		this.setDefaultCloseOperation(3);
		this.getContentPane().setBackground(Color.WHITE);
		this.setLocationRelativeTo(null);// 设置居中
//		 this.setUndecorated(true);
		// 设置流式布局
		java.awt.FlowLayout fl = new java.awt.FlowLayout();
		this.setLayout(fl);
		this.setVisible(true);

		JButton jbuAdd = new JButton("创建");
		JButton jbuStart = new JButton("启动");
		JButton jbuStop = new JButton("暂停");

		// 把按钮添加到窗体上
		this.add(jbuAdd);
		this.add(jbuStop);
		this.add(jbuStart);

		BallListener bl = new BallListener(this);// 创建小球监听器对象
		// 添加按钮监听器
		jbuAdd.addActionListener(bl);
		jbuStart.addActionListener(bl);
		jbuStop.addActionListener(bl);
		jbuAdd.setFocusable(false);
		jbuStart.setFocusable(false);
		jbuStop.setFocusable(false);
		this.addMouseListener(bl);

	}
}

 

  监听器类:

package cn.lzj0801;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * 这是一个监听器类,实现了ActionListener接口
 * 
 * @author lzj
 * 
 */
public class BallListener implements java.awt.event.ActionListener,
		MouseListener {
	java.util.Random rand = new java.util.Random();
	BallFrame bf;
	private int x, y;
	MyArrayList<BallThread> al = new MyArrayList<BallThread>();

	// 重写构造方法
	public BallListener(BallFrame bf) {
		this.bf = bf;
	}

	// 重写监听器的事件处理方法
	@Override
	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();
		if (str.equals("创建")) {
			System.out.println("=======================" + str);
			BallThread ball = new BallThread(rand.nextInt(700),
					rand.nextInt(700), 20, 8, 8, bf, al);
			ball.start();
			al.add(ball);
		} else if (str.equals("启动")) {
			for (int i = 0; i < al.size(); i++) {
				BallThread ball = al.get(i);
				ball.stateFlag = false;
			}

		} else if (str.equals("暂停")) {
			for (int i = 0; i < al.size(); i++) {
				BallThread ball = al.get(i);
				ball.stateFlag = true;
			}

		} else if (str.equals("删除")) {
			BallThread ball = al.get(al.size()-1);
			al.delete(al.size()-1);
			ball.flag = true;
		}

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// x = e.getX();
		// y = e.getY();
		// for (int i = 0; i < al.size(); i++) {
		// int ox = al.get(i).getX() + al.get(i).getSize() / 2;
		// int oy = al.get(i).getY() + al.get(i).getSize() / 2;
		// System.out.println("delete");
		// if (Math.sqrt(Math.abs(x-ox) * Math.abs(x - ox) + Math.abs(y - oy) *
		// Math.abs(y - oy)) <= al.get(
		// i).getSize() / 2) {
		// al.delete(i);
		// al.get(i).flag = true;
		// }
		// }
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}
}

 

小球类:

package cn.lzj0801;

import java.awt.Color;
import java.awt.Graphics;

import java.awt.Image;

import javax.swing.ImageIcon;

public class BallThread extends Thread {
	private int x, y, size, movex, movey;

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	private BallFrame bf;
	private Graphics g;
	boolean stateFlag = false;// 声明布尔类型的变量表示状态
	boolean flag = false;
	java.util.Random rand = new java.util.Random();
	private Image img = new javax.swing.ImageIcon("images\\doge.gif")
			.getImage();
	MyArrayList<BallThread> al;
	BallThread ball;

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	private int a = rand.nextInt(255);
	private int b = rand.nextInt(255);
	private int c = rand.nextInt(255);

	// 重写构造方法
	public BallThread(int x, int y, int size, int movex, int movey,
			BallFrame bf, MyArrayList al) {
		this.x = x;
		this.y = y;
		this.size = size;
		this.movex = movex;
		this.movey = movey;
		this.bf = bf;
		g = this.bf.getGraphics();
		this.al = al;
	}

	// 重写run方法
	public void run() {
		while (!flag) {
			System.out.println();
			if (stateFlag) {// 若stateFlag为true,执行continue,进行空循环,不执行下面的语句;否则,执行下面的语句
				continue;
			}
			
			g.setColor(Color.WHITE);
			g.fillOval(x, y, size, size);
			// g.fillRect(x, y, size, size);
			x += movex;
			y += movey;
			g.setColor(new Color(a, b, c));
			g.fillOval(x, y, size, size);
			// g.drawImage(img, x, y, size, size, null);

			if (x > (700 - size) && movex > 0) {
				movex = -movex;
			}
			if (y > (700 - size) && movey > 0) {
				movey = -movey;
			}
			if (x < 2 && movex < 0) {
				movex = -movex;
			}
			if (y < 25 && movey < 0) {
				movey = -movey;
			}
			// 碰撞处理,比较圆心之间距离,遍历数组队列,找出当前球与其他球的圆心距离
			for (int i = 0; i < al.size(); i++) {
				ball = al.get(i);
				if (this == ball) {
					continue;
				}
				int xx = Math.abs(this.x - ball.x);
				int yy = Math.abs(this.y - ball.y);
				int xy = (int) Math.sqrt(xx * xx + yy * yy);
				int tempx = 0;
				int tempy = 0;
				//boolean changeFlag =true;
				if (xy <= (this.size / 2 + ball.size / 2 )) {
					tempx = this.movex;
					tempy = this.movey;
					this.movex = ball.movex;
					this.movey = ball.movey;
					ball.movex = tempx;
					ball.movey = tempy;
//					changeFlag = false;

				}
			}

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

 

数组队列类:

package cn.lzj0801;

/**
 * 纯粹的数组队列,实行增删改查等功能,一个第三方的类
 * 
 * @author lzj
 * 
 */
public class MyArrayList<E> {
	private Object[] array;// 声明对象数组
	private int size = 0;// 声明size属性,设置初值为0

	/**
	 * 构造方法
	 */
	public MyArrayList() {
		array = new Object[0];// 初始化
	}

	public MyArrayList(int size) {
		array = new Object[size];// 初始化
	}

	/**
	 * 向数组队列中添加元素的方法
	 * 
	 * @param elements要添加的元素
	 */
	public void add(E element) {
		// 创建一个新的数组,长度为size+1
		Object[] newArray = new Object[size + 1];
		for (int i = 0; i < size; i++) {
			newArray[i] = array[i];// 赋值
		}
		newArray[size] = element;// 添加元素至数组最后的位置
		size++;// size加1
		array = newArray;// 把newArray的地址给array
	}

	/**
	 * 根据索引删除对应的元素(删除区别于移除,删除需要释放空间)
	 * 
	 * @param index要删除的元素的索引
	 * @return
	 */
	public E delete(int index) {
		if (index < 0 || index >= size)// 防止所给下标为负值或超出size
			return null;
		Object temp;// Object类型变量
		temp = array[index];// 将被删除的元素赋予临时变量temp
		Object[] newArray = new Object[size - 1];// 创建Object类数组,数组长度减1
		// 小于索引时,照搬过去
		for (int i = 0; i < index; i++) {
			newArray[i] = array[i];// 把值移到新数组中
		}
		// 大于索引时
		for (int i = index; i < size - 1; i++) {
			array[i] = array[i + 1];// 移位填补空位
			newArray[i] = array[i];// 把值移到新数组中
		}
		array = newArray;// 把newArray的地址给array
		size--;
		return (E) temp;// 返回被删除的元素
	}

	/**
	 * 根据索引插入对应的元素
	 * 
	 * @param index要插入的位置的索引
	 * @return
	 */
	public E ins(int index, E element) {
		Object[] newArray = new Object[size + 1];// 创建Object类数组,数组长度减1
		// 小于索引时,照搬过去
		for (int i = 0; i < index; i++) {
			newArray[i] = array[i];// 把值移到新数组中
		}
		newArray[index] = element;
		// 大于索引时
		for (int i = index; i < size; i++) {
			newArray[i + 1] = array[i];// 把值移到新数组中
		}
		array = newArray;// 把newArray的地址给array
		size++;
		return element;// 返回被插入的元素
	}

	// 得到数组队列的长度的方法
	public int size() {
		return size;
	}

	// 根据索引和传人的元素设定相应的元素
	public void set(int index, E obj) {
		array[index] = obj;
	}

	// 根据索引得到相应的元素
	public E get(int index) {
		if (index < 0 || index >= size)// 防止所给下标为负值或超出size
			return null;
		return (E) array[index];
	}

	public E find(E obj) {
		for (int i = 0; i < size; i++) {
			if (array[i].equals(obj))
				return (E) array[i];
		}
		return null;
	}

	// 修改元素,根据元素和下标
	public void modify(E element, int index) {
		array[index] = element;
	}

}

 

0
1
分享到:
评论

相关推荐

    JAVA运用多线程实现碰撞的小球

    通过JAVA运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。

    JAVA多线程实验,字符移动、小球碰撞

    本实验通过“字符移动”和“小球碰撞”两个实例,深入浅出地展示了Java多线程的概念、创建与管理。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们共享进程的...

    多线程之小球碰撞

    标题“多线程之小球碰撞”涉及到的是计算机编程中的多线程技术,结合描述中的博文链接,我们可以推测这篇文章可能是通过一个模拟小球碰撞的示例来讲解多线程编程的概念和实践。在这个场景中,每个小球可以代表一个...

    java多线程控制小球程序

    总之,“java多线程控制小球程序”是一个结合了Java多线程、GUI编程和基本物理原理的实践案例。通过这个项目,开发者可以深入理解Java线程的创建、控制以及线程安全问题,同时也能锻炼到GUI编程和实时动画更新的能力...

    JAVA线程与进程的区别

    JAVA语言中,线程(Thread)和进程(Process)是两个基本概念,它们都是操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。但是,它们之间有着本质的区别。 首先,进程是操作系统...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要...通过对这些知识点的学习和实践,读者可以深入理解Java多线程的运用,提升编程技能。

    java小球碰撞边框反弹并且互相碰撞消失

    综上所述,开发这样一个Java小球碰撞游戏涉及到了GUI设计、对象模型、物理运动模拟、边界和碰撞检测、事件处理、多线程编程以及图形更新等多个核心编程概念。理解并掌握这些知识点,对于提升Java编程能力非常有帮助...

    小球碰撞java版本

    采用多线程的方式模拟小球碰撞的图形化方式

    小球碰撞-炫彩版

    在"小球碰撞-炫彩版"这个项目中,开发者运用了Java编程语言来实现一个动态的、基于多线程的模拟系统。该系统的主要功能是展示一个小球在屏幕上不断摇摆,并与其他小球发生碰撞,同时球的颜色、速度和运动方向都会因...

    73道Java面试题合集-多线程与进程

    在Java编程领域,多线程和进程是两个关键的概念,对于任何有志于从事Java开发的程序员来说,理解和掌握它们至关重要。...通过深入学习和实践,开发者能够编写出更加高效、安全的多线程Java应用程序。

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java弹球小游戏,多线程

    Java弹球小游戏是一款基于Java编程语言开发的简单游戏,它运用了多线程技术来实现游戏的流畅运行。在这个游戏中,通常会有至少两个线程在同时工作:一个是控制游戏主循环,另一个则处理用户输入或其他特定的游戏逻辑...

    java 多线程操作数据库

    在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入探讨其背后的原理、实现细节以及潜在的挑战。...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    Java 的多线程,程序、进程和线程的概念31

    在IT领域,尤其是Java编程中,多线程是不可或缺的一部分,它使得程序能够同时执行多个任务,极大地提高了程序的效率和响应性。本教程“Java的多线程”由孙鑫老师主讲,旨在帮助初学者从入门到精通地掌握这一关键技能...

    多个小球的碰撞

    标题“多个小球的碰撞”涉及的是一个计算机编程问题,主要使用Java语言来实现。这个题目可能是指在二维空间中模拟多个小球的物理碰撞,其中小球的运动不受用户控制,但可以通过调整代码中的参数(例如在manyballs类...

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

Global site tag (gtag.js) - Google Analytics