今天学习的是线程的有关知识。在了解线程之前我们应该先了解进程是什么,进程就是进程是操作系统结构的基础,是一个正在执行的程序。而线程则是包含在进程之中的,线程之间可以交互数据,且一个进程中可以包含多个线程。
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。而多线程程序则不然,它只会先通知一个线程开始执行,然后再依次通知下一个,并不会理会线程是否完成。
要使一个程序实现线程有两种方法:一种方法是将类声明为 Thread 的子类,该子类应重写 Thread 类的 run 方法。另一种方法是声明实现 Runnable 接口的类,该类然后实现 run 方法。
以下是简单的线程示例:弹球碰撞(球之间的碰撞还未完成)
小球运动的类
简单弹球游戏的界面的类
运行图像
[img]http://dl.iteye.com/upload/attachment/528384/72d7ab1f-78ff-375a-8899-6edc60f9faa0.jpg[/img]
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。而多线程程序则不然,它只会先通知一个线程开始执行,然后再依次通知下一个,并不会理会线程是否完成。
要使一个程序实现线程有两种方法:一种方法是将类声明为 Thread 的子类,该子类应重写 Thread 类的 run 方法。另一种方法是声明实现 Runnable 接口的类,该类然后实现 run 方法。
以下是简单的线程示例:弹球碰撞(球之间的碰撞还未完成)
小球运动的类
public class Ball extends Thread {
// 得到的画布对象
Graphics g;
// 小球的初始位置
int x = 0, y = 0;
// 小球移动的增量
int dx = 0, dy = 0;
BallUI ballui;
public Ball(BallUI ballui) {
this.ballui = ballui;
// 由窗体对象得到画布对象
g = ballui.panel.getGraphics();
// 由随机数发生器产生小球位置的信息
Random rd = new Random();
x = rd.nextInt(100) + 150;
y = rd.nextInt(100) + 150;
dx = rd.nextInt(10) - 5;
dy = rd.nextInt(10) - 5;
}
/**
* 重写run方法
*/
public void run() {
move();
}
public void move() {
while (true) {
// 擦除球
g.setColor(ballui.panel.getBackground());
g.fillOval(x, y, 30, 30);
// 画球
g.setColor(Color.BLACK);
if ((x < 395 && x > 0) && (y > 0 && y < 370)) {// 如果球未碰边
g.fillOval(x = x + dx, y = y + dy, 30, 30);
} else if (!(x < 395 && x > 0) && !(y > 0 && y < 370)) {// 如果球同时碰2两条边,同时改变dx,dy
dx = -dx;
dy = -dy;
g.fillOval(x = x + dx, y = y + dy, 30, 30);
} else if ((x < 395 && x > 0) && !(y > 0 && y < 370)) {// 如果球碰竖边
dy = -dy;
g.fillOval(x = x + dx, y = y + dy, 30, 30);
} else if (!(x < 395 && x > 0) && (y > 0 && y < 370)) {// 如果球碰横边
dx = -dx;
g.fillOval(x = x + dx, y = y + dy, 30, 30);
}
try {
sleep(25);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
简单弹球游戏的界面的类
public class BallUI extends JFrame {
public static void main(String args[]) {
// 创建界面对象
BallUI ballui = new BallUI();
ballui.showUI();
}
public void showUI() {
this.setTitle("弹球游戏 test-1");
this.setSize(500, 500);
// 创建菜单栏和菜单
JMenuBar jmb = new JMenuBar();
this.setJMenuBar(jmb);
JMenu jm = new JMenu("游戏");
jmb.add(jm);
JMenuItem jmi = new JMenuItem("开始");
jm.add(jmi);
// 建立流式布局管理器
java.awt.FlowLayout fl = new java.awt.FlowLayout();
this.setLayout(fl);
// 创建JPanel作为游戏区域
panel = new JPanel();
Dimension dims = new java.awt.Dimension(425, 400);
panel.setPreferredSize(dims);
panel.setBackground(java.awt.Color.LIGHT_GRAY);
this.add(panel);
// 创建开始的按钮
JButton jbu = new JButton("开始");
this.add(jbu);
this.setDefaultCloseOperation(3);
this.setVisible(true);
// 取得画布对象
final Graphics g = panel.getGraphics();
// 创建监听器对象(匿名内部类)
ActionListener alis = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//创建一个小球对象
Ball ball = new Ball(getUI());
ball.start();
}
};
//将监听器对象加在按钮上
jbu.addActionListener(alis);
}
public BallUI getUI(){
return this;
}
JPanel panel;
}
运行图像
[img]http://dl.iteye.com/upload/attachment/528384/72d7ab1f-78ff-375a-8899-6edc60f9faa0.jpg[/img]