线程+动态数组=运动的小球

一,线程
之前我们执行的任务都是顺序执行,下一个任务要等上一个任务执行完之后才可以执行,一旦任务多了起来,那么等待的时间将会很久,于是我们考虑能否让多个任务同时执行,不用等待上个任务结束就能开启下一个任务?
java提供了并发机制,而将并发完成的每一件事称为线程(Thread)。以我们的电脑为例,我们可以同时听歌、聊天、下载文件,这种并发机制大大提高了我们的用户体验。
二,动态数组
动态数组ArrayList可以动态地往数组中增加或者删除元素,在创建数组对象时默认大小为16个元素,如果增加的元素大于16个,数组会自动将容量扩大为原来的两倍,依次类推,而不需要手动扩容。
ArrayList有很多方法:

		ArrayList alist = new ArrayList();//创建一个动态数组
		alist.add(1);//往数组中增加数字1
		alist.add('a');//往数组中增加字符a
		alist.add("bcd");//往数组中增加字符串bcd
		int zhengshu = (int)alist.get(0);//得到数组下标为0的元素
		alist.remove(0);//清除数组下标为0的元素
		Object[] values=alist.toArray();//将数组中所有元素转化为Object类型
		for(int i=0;i<values.length;i++) {
    
    
			System.out.println(values[i]);
		}
		
		alist.clear();//清除数组中所有元素

和数组不一样,因为可以转化为Object类型的数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但当调用ArrayList的方法时,要么传递所有元素都可以正确转型的类型,要么转化为Object类型,否则会出错。
三,动态数组发射子弹的实现
1,创建一个子弹类,包含子弹的起始点坐标

package com.yzd0121.ThreadV4;

public class Fly {
    
    
	int x;
	int y;
	public Fly(int x,int y){
    
    
		this.x=x;
		this.y=y;
	}

}

2,实现界面,创建一个全局用来存储对象的队列

package com.yzd0121.ThreadV4;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.util.ArrayList;

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

public class Game extends JFrame{
    
    
	//全局用来存储对象的队列
	private ArrayList<Fly>flys=new ArrayList();
	
	public void showUI() {
    
    
		this.setSize(800,600);//设置窗体大小
		this.setLayout(new FlowLayout());//设定流式布局
		
		JButton jbutton = new JButton("发射");//创建一个按钮
		this.add(jbutton);//将按钮添加到窗体上
		this.setVisible(true);//设置窗体可见
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出时关闭
		
		Color bgcolor=this.getBackground();//得到画板背景颜色
		
		//界面可视化之后得到画笔
		Graphics g=this.getGraphics();
	}
	
	//主函数  程序入口
	public static void main(String[] args) {
    
    
		Game game=new Game();
		game.showUI();
	}

}

3,实现监听
每按一次按钮,都随机产生两个数,将这两个数作为子弹的起始坐标创建一个子弹对象,并将该对象添加到动态数组中。

package com.yzd0121.ThreadV4;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;


public class DrawAction implements ActionListener{
    
    
	private ArrayList<Fly>flys;
	private Graphics g;
	
	//构造方法  使本类中使用的画笔和队列为主函数中同一个画笔和队列
	public DrawAction(ArrayList<Fly>flys,Graphics g) {
    
    
		this.flys=flys;
		this.g=g;
	}
    public void actionPerformed(ActionEvent e) {
    
    
    	//每按一次按钮  都向队列中添加一个炮弹对象
    	Random random=new Random();
    	int x=random.nextInt(800);
    	int y=random.nextInt(600);
    	//生成Fly对象   根据构造方法  将x、y参数传进
    	Fly fly=new Fly(x,y);
    	flys.add(fly);//将生成的炮弹对象加入到队列中
    	System.out.println("add paodan ok");
    }
 

}

实现监听功能之后在界面中将按钮绑定监听

		//创建监听器对象  按钮绑定
		DrawAction da=new DrawAction(flys,g);
		jbutton.addActionListener(da);

4,线程功能的实现
<1>创建一个DrawThread类继承Thread类,利用构造器将画板中的动态数组和画笔传入。

package com.yzd0121.ThreadV4;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;

public class DrawThread extends Thread{
    
    
	private ArrayList<Fly>flys;
	private Graphics g;
	private Color bgcolor;
	//构造方法  传参  使得本类中使用的队列和画笔为主类中的队列和画笔
	public DrawThread(ArrayList<Fly>flys,Graphics g,Color gbcolor) {
    
    
		this.flys=flys;
		this.g=g;
		this.bgcolor=bgcolor;
	}

}

<2>重写run()方法,实现线程功能

	public void run() {
    
    
		System.out.println("启动一个线程");
		//每过10ms就移动一次队列中所有子弹   不停地做这个事
		while(true) {
    
    
			g.setColor(Color.green);
			for(int i=0;i<flys.size();i++) {
    
    
				Fly fly=flys.get(i);
				g.fillOval(fly.x, fly.y, 50, 50);
				fly.x++;
			}
			try{
    
    
				Thread.sleep(10);
			}catch(Exception ef) {
    
    };
			//清屏
			g.setColor(Color.red);
			g.fillRect(0, 50 , 800, 600);
		}
	}

for循环每过10ms就移动一次队列中全部子弹,while循环使得线程一直在运行,不会因为子弹全部画完而自动终止。
<3>界面Game类中创建线程对象,调用start()方法,启动线程。

		//启动一个线程去画图
		DrawThread dthread = new DrawThread(flys,g,bgcolor);
		dthread.start();
		System.out.println("线程启动成功");

启动线程时调用stat()方法会自动调用run()方法执行线程任务。
这里我们注意,由于程序比较简单,我们只创建了一个线程,所以程序运行过程中一直只有一个线程在运行,但当需要处理的任务很多时,我们可以创建几个线程并行执行任务,提高工作效率。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43722843/article/details/112972964