浅谈java线程应用(以画线程小球为例)

浅谈java线程应用(以画线程小球为例)

首先我们需要来思考这样一个问题:
1.我们先在界面上画一个小球,这个很容易实现

2.进一步,我们需要让这个小球在界面上动起来。这就需要擦除这个小球,然后改变这个小球的坐标,再在新的坐标处画一个新的小球!

3.写一个死循环,不断被重复2的过程,再加上时间暂停,我们就会看见一个小球在屏幕上向前运动。

但是现在出现了一个问题,如果按照以前的程序结构,程序自上而下的运行,那么当程序执行到了小球运动的那部分代码,程序就只会不断地执行画球死循环,无法再运行循环以下的代码。此时,我们就需要使用线程。

首先我们要知道线程的作用:当程序运行到需要不断画小球时,我们重新启动一个进程,这个进程和主程序的进程独立,因此主程序在启动了这个进程后无需等待,主程序和新开的线程可以同时进行。这我们就实现了画小球时可以继续运行其他的代码。具体代码如下:
以下为监听器中代码:

 public void mouseClicked(MouseEvent e) {
		x = e.getX();
		y = e.getY();

		g.setColor(Color.black);

		//创建线程类
		DrawBall draw = new DrawBall(x,y,g);
		
		//创建线程
		Thread Thread=new Thread(draw);
		
		//start()方法启动线程
		Thread.start();
		
		//检验程序
				for(int i=0;i<10;i++)
				System.out.println("主程序未中断");

	}

以下为小球线程中的代码:

public class DrawBall implements Runnable {

	int x;
	int y;
	Graphics g;

	DrawBall(int x1, int y1, Graphics g1) {
		x = x1;
		y = y1;
		g = g1;
	}
// 重写run方法
	public void run() {

		// 无限循环画球
		System.out.println("线程启动成功");
		while (true) {
			g.fillOval(x - 25, y - 25, 50, 50);
			x += 40;

			// 让程序暂停100ms
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
}
}

现在小球运动的问题解决了,接下来这个问题需要升级一下,我们要在屏幕上画多个小球,且他们要同时运动。我们自然想到线程中写多个小球,但这样会出现一个问题,如果将多个小球写到同一个线程中,小球还是只能一个一个的画,无法看到多个小球同时运动。

所以我们需要调整一下想法,给每一个跳动的小球都开一条单独的线程,这样各自之间就单独运动,不会互相影响。具体代码如下:

public void mouseClicked(MouseEvent e) {
		i++;
		x = e.getX();
		y = e.getY();

		g.setColor(Color.black);
		
		**//创建线程,每点击一次都创建一个小球线程的封装类**
		Thread Thread=new Thread(new DrawBall(x,y,g,i));
		
		//start()方法启动线程
		Thread.start();
		
		//检验程序
				for(int j=0;j<10;j++)
				System.out.println("主程序未中断"+i);

	}

这样就应用了多线程解决了多个小球一起运动的问题,但是多运行几次就会发现这种模式可能会出现小球残影。

给大家埋个坑,之后再写一篇博客教大家如何解决这个问题!

一起进步,加油!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值