大家都知道,当你需要用代码执行多任务时,线程的使用显得必不可少。所以,今天咱们来谈谈java中线程的使用。
以线程小球的移动为例:当我们要实现一个小球的移动时,不用线程也可以实现,首先用重绘的paint方法,在里面利用一个简单的循环,再设置每个循环之间的间隔时间,就能实现一个小球的移动。但是,这是我们会发现,你启动线程小球开始的那个按钮会变为按下的状态,即为不可按的状态。为什么会这样呢,其实是因为在没有开启线程状态下,系统只有完成了指定的任务后才能操作来进行下个任务,这样就很不方便,所以我们采用线程。
首先我们先来了解下线程的使用方法,第一种是实现Runnable接口:
public class Runball implements Runnable {
}
第二种是继承Thread的方法
class MyThread extends Thread{
}
调用线程的时候只需要实例化Thread对线,在调用里面的start方法即可。
小球的基本移动已实现,现在讲讲小球的碰撞界面边缘后的反弹,首先我们可以给小球定义4个基本属性,小球的位置x,y以及小球的2个方向的移动速度vx,vy.只需要加上一个判断,以水平方向的壁为例,vy不变,至于要令vx反向即可。
x=x+vx;
if(x<0||x+size>800){
vx = -vx;
}
接着就是小球的添加,我们需要实现只要点击按钮小球即可被创建。我们可以将小球看成一个类,在这个类中定义小球的各种属性,把这个类存到一个数组中,点击按钮后从数组中把它取出即可。这里我用到了以前写过的数组队列的方法。以下三部分代码分别是:1.创建一个balllist数组。2.循环取出balllist数组中的对象。3.实例化Ball对象并调用balllist里的add方法。使用数组队列的好处是不用担心数组越界的问题。
private MyarrayList balllist =new MyarrayList();
for(int i=0;i
Ball ball=balllist.get(i);
ball.draw(g);
}
Ball ball=new Ball(this);
balllist.add(ball);
创建出多个小球后,我们会发现有很多小球会和另一个小球重叠地穿透过去,这根本不符合物理规律嘛,所以我们再加上小球之间的碰撞,这里我们没有特别严谨的分析。。。只是简单地把所有的碰撞都看成两个方向完全相反的小球的碰撞,这样只需要判断两小球球心间的距离与两小球半径和的大小关系,碰撞后使两小球速度变为另一个小球的速度即可。
最后就是小球的定时任务,即我们按下一个按钮后会每隔一段时间自动创建一个小球。这里我使用的方法是重新创建一个线程,在这个线程中用到上述方法中的创建小球的方法,并且有1000ms的休眠时间,这样就能简单地实现这个功能。