一、线程入门
- 进程:进行中的程序,操作系统分配资源的最小单位
- 线程:CPU调度的最小单位,线程属于某个进程
- 单线程:按照程序的顺序执行
- 多线程:能让进程同时执行多段程序
二、实现多线程小球
- Thread线程类
- Runnable接口:规定线程需要执行的内容
写一个界面,实现鼠标点击一下,出现一个小球,同时小球向右移动,再点击一下鼠标,又出现一个小球,同时小球向右移动…
第一步,先写一个窗体界面
public void initUI() {
JFrame jf = new JFrame();
jf.setTitle("BallGame");
jf.setSize(800, 600);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
jf.setBackground(Color.WHITE);
jf.setVisible(true);
jf.getContentPane().setVisible(false);
Graphics g =jf.getGraphics();
MyListener ml = new MyListener(g,x,y,m,n);
jf.addMouseListener(ml);
}
第二步,写了一个MyBall类,用来实现小球的绘制和移动
move方法,其中x,y是小球坐标,初始值由鼠标点击获取,之后会随着小球的运动而发生改变。当小球运动到窗体边界时,就会调转方向,继续移动。
public void move() {
x += m;
y += n;
if(x > 740) {
m = -m;
}
if(x < 0) {
m = -m;
}
if(y > 540) {
n = -n;
}
if(y < 0) {
n = -n;
}
}
m,n代表小球在左右方向上移动的速度,为了让小球的运动具有随机性,我定义了一个随机数,来确定小球移动的方向,向右,向下或者斜向下。(这里关于方向还可以有更多的设计,这里我就简单定义了一下)
Random r = new Random();
int num = r.nextInt(3);
switch(num) {
case 0:
m = 0;
n = 2;
break;
case 1:
m = 0;
n = 2;
break;
case 2:
m = 2;
n = 2;
break;
}
ball_move方法实现了小球的绘制与移动,首先,根据x,y坐标画一个小球出来,等待100ms,在同一位置画一个与背景色一致的的圆,接着,小球坐标x,y发生改变,继续画圆、覆盖,这样连续下来,我们看到的就是小球朝着某个方向移动。
public void ball_move() {
while(true) {
g.setColor(color);
g.fillOval(x, y, 50, 50);
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
g.setColor(Color.WHITE);
g.fillOval(x, y, 50, 50);
this.move();
}
}
第三步,创建一个MyRunnable方法来实现Runnable接口中的run方法
这里就创建小球对象,让小球移动就可以了
public void run() {
Random r = new Random();
int num = r.nextInt(3);
switch(num) {
case 0:
m = 0;
n = 2;
break;
case 1:
m = 0;
n = 2;
break;
case 2:
m = 2;
n = 2;
break;
}
MyBall ball = new MyBall(x, y, m, n, g,color);
ball.ball_move();
}
第四步,创建鼠标监听器,MyListener类
获取鼠标点击出的坐标,并在鼠标点击后,创建线程。
public void mouseClicked(MouseEvent e) {
//获取坐标
x = e.getX();
y = e.getY();
//创建线程
Random r1 = new Random();
color = new Color(r1.nextInt(256), r1.nextInt(256), r1.nextInt(256));
MyRunnable mr = new MyRunnable(g, x, y, m, n, jf,color);
Thread thread = new Thread(mr);
thread.start();
}
这样一个简单的多线程小球就做好了
看一下效果
![](https://img-blog.csdnimg.cn/20200815193911702.gif)
当界面中,小球的数量增多时,会发现一个问题,小球的颜色变得不稳定,同时还出现了残影,这个问题的产生是多线程应用的必然,我将在下一节来解释为什么会这样,同时用一个新的方法来实现小球运动的操作。