多线程小结
多线程小结
进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时运行多个进程,由于 CPU 具备分时机制,所以每个进程都能循环获得自己的 CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像在“同时”运行一样。
多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是在进程的基础之上进行的进一步划分。多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在、同时运行,一个进程可能包含了多个同时执行的线程。
线程与进程的区别
1、 简单地说一个应用程序就是一个进程,而线程是一个进程内部的多个运行单位。
2、 多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源(在同一进程内),在程序内部可以互相调用(通过对象方法)
3、 现成本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换进程切换的负担要小
线程的启运是通过调用线程对象的 start() 方法启动,线程运行是从线程对象的 run 方法开始,当线程对象的 run() 方法结束后,线程即运行结束。
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
/**
*
* @author Administrator
*
*/
public class Ball extends Thread {
// 获得小球的初始坐标
private int X0, Y0;
private int x, y;
private BallUtil bu;
private Graphics g;
// 取得一个随机数
private Random rd = new Random();
// 获得随机颜色
int r = rd.nextInt(255);
int t = rd.nextInt(255);
int b = rd.nextInt(255);
Color c = new Color(r, t, b);
public Ball(BallUtil bu) {
this.bu = bu;
g = bu.getGraphics();
// 获得小球的初始位置
X0 = rd.nextInt(500) + 50;
Y0 = rd.nextInt(500) + 50;
// 设置小球运动的随机增量
x = rd.nextInt(20) - 10;
y = rd.nextInt(20) - 10;
}
public void run() {
move();
}
public void move() {
while (true) {
// 清除图像
// 设置颜色为窗体的背景色
g.setColor(bu.getContentPane().getBackground());
g.fillOval(X0, Y0, 20, 20);
// 小球碰到左边窗体时反弹
if (X0 <= 10) {
if (x < 0) {
x = -x;
if (y != 0) {
X0 += x;
Y0 += y;
}
if (y == 0) {
X0 += x;
}
}
}
// 小球碰到上边界时反弹
if (Y0 <= 50) {
if (y < 0) {
y = -y;
if (x != 0) {
X0 += x;
Y0 += y;
}
if (x == 0) {
Y0 += y;
}
}
}
// 小球碰到右边界时反弹
if (X0 >= 570) {
if (x > 0) {
x = -x;
if (y != 0) {
X0 += x;
Y0 += y;
}
if (y == 0) {
X0 += x;
}
}
}
// 小球碰到下边界时反弹
if (Y0 >= 570) {
if (y > 0) {
y = -y;
if (x != 0) {
X0 += x;
Y0 += y;
}
if (x == 0) {
Y0 += y;
}
}
}
// 小球碰到左上角反弹
if (X0 <= 10 && Y0 <= 50) {
X0 += Math.abs(x);
Y0 += Math.abs(y);
}
// 小球碰到右上角反弹
if (X0 >= 570 && Y0 <= 50) {
X0 = X0 - Math.abs(x);
Y0 += Math.abs(y);
}
// 小球碰到左下角反弹
if (X0 <= 10 && Y0 >= 570) {
Y0 = Y0 - Math.abs(y);
X0 += Math.abs(x);
}
// 小球碰到右下角反弹
if (X0 >= 570 && Y0 >= 570) {
X0 = X0 - Math.abs(x);
Y0 = Y0 - Math.abs(x);
} else {
X0 += x;
Y0 += y;
}
g.setColor(c);
// 在内部类中使用外部的变量,必须定义成 final
g.fillOval(X0, Y0, 20, 20);
try {
Thread.sleep(100);
} catch (Exception ef) {
ef.printStackTrace();
}
}
}
}