浅谈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);
}
这样就应用了多线程解决了多个小球一起运动的问题,但是多运行几次就会发现这种模式可能会出现小球残影。
给大家埋个坑,之后再写一篇博客教大家如何解决这个问题!
一起进步,加油!