多线程总结_1
该总结基于弹球游戏初步开发阶段的代码:实现小球碰到边界后改变方向。
首先要理解两个概念:
进程:通俗的说法,进程就相当于一个应用程序。不同的进程在内存中都会有不同的独立的内存空间,各个进程之间不能共用相同的内存空间。
线程:简单而言就是进程中的一个组成单位。一个进程里可以有很多个线程,同一个进程里的所有线程共享同一块内存区域,这是线程与进程的基本差异。
多线程在程序内部可以互相调用(通过对象方法);而进程间通信大多数情况是必须通过网络实现。线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。
在java中,每个线程对象都是一个继承了java.util.Thread类的对象或implements了java.util.Runnable接口的类的对象,线程的启运是通过调用线程对象的start()方法启动,线程运行是从线程对象的run方法开始,当线程对象的run()方法结束后,线程即运行结束。线程的创建,一般通过如下两种方法:
1.继承Thread类实现线程;2.实现Runnable接口创建线程
其次,主要代码及对进程的认识如下:
先创建一个弹球线程类,让它继承线程类(Thread),然后重写run方法。
注意,使用线程时,先创建线程对象thread_1,在通过调用线程的start()方法启动线程,如:Thread_1.start(); 而start方法只会调用弹球线程类的run方法,如果该类中还定义了其他的方法,则必须将其他的方法在run方法中调用,否则不能直接通过线程对象调用其他的方法。
此次用到的新知识:
使用随机对象随机获取小球的初始位置:
java.util.Random sj=new java.util.Random();//取得随机数对象
······
//随机取得x0和y0的值
this.x0=sj.nextInt(300)+150;//x0的范围是150到450
this.y0=sj.nextInt(300)+150;
匿名内部类:
以往我们要添加监听器是都是通过创建一个监听器类来实现,但是当我们在原有的代码基础上,在不改变源代码的情况下,要添加一个组件再给这个组件添加一个监听器,则需要用到匿名内部类来实现:
ActionListener ls = new ActionListener() {
// 内部匿名类
public void actionPerformed(ActionEvent e) {
//要执行的动作
};
注意:传入匿名类执行的动作中涉及到得方法的参数必须定义为final型的,以防在程序执行阶段修改了某些参数导致程序无法运行。
设置背景颜色:
this.getContentPane().setBackground(Color.WHITE);
//将背景的颜色设置为白色
设置布局管理器的新方法:
this.setLayout(new FlowLayout());// 布局管理器
在代码编写过程中遇到的问题:
要实现同一个小球不断地运动
利用人眼的延迟效应,先画一个蓝色的小球再在同一个坐标画一个白色(背景色)的小球,然后将小球的坐标改变,重复以上操作,则实现了小球的移动效果,具体代码如下 (中途设置了线程的休眠则是控制了小球每次移动的时间间隔):
g.setColor(Color.BLUE);//取得小球的颜色为蓝色
g.fillOval(x0, y0, 20, 20);//设置小球的初始位置和大小
try{//让线程休眠200ms:即小球每运动一次的时间间隔是200ms
Thread.sleep(200);
}catch(Exception ef){
ef.printStackTrace();
}
g.setColor(Color.WHITE);//将上面蓝色的小球的颜色取为白色,相当于小球不见了
g.fillOval(x0, y0, 20, 20);
x0+=10;//每次小球的x0和y0同时递增,则小球向右下运动
y0+=10;
实现小球碰到边界时弹回来
首先要大致确定边界的坐标。
其次是要设计算法:加上两个控制小球方向的标计量int a,b;把他们的初值都设为10,然后将小球每次横纵坐标的变化设为:x0+=a;y0+=b;当小球碰到边界时,相应的a,b的值也要发生变化:当碰到左右边界时,b不变,a要变成-a;当碰到上下边界时,a的值不变,b的值要变为-b。具体代码实现如下:
x0+=-a;
y0+=b;
if(x0<7||x0>574){
a=-a;
}
if(y0>572||y0<65){
b=-b;
}
整个弹球的界面实现代码如下:
import java.awt.Color;
public class Ball_UI extends JFrame {
public static void main(String[] args) {
Ball_UI ball = new Ball_UI();
ball.initUI();
}
public void initUI() {
this.setTitle("弹球游戏");
this.setSize(600, 600);
// 添加按钮
this.setLayout(new FlowLayout());// 布局管理器
JButton bu = new JButton("开始");
this.add(bu);// 添加
this.getContentPane().setBackground(Color.WHITE);//将背景的颜色设置为白色
this.setDefaultCloseOperation(3);
this.setVisible(true);
final Graphics g = this.getGraphics();// 取得画布对象,要传入监听器内,所以定义为final
// 添加按钮监听器
ActionListener ls = new ActionListener() {
// 内部匿名类
public void actionPerformed(ActionEvent e) {
Ball_Thread bth = new Ball_Thread(g);
bth.start();
}
};
bu.addActionListener(ls);
}
}[/size]