多线程总结

多线程总结

多线程小结

多线程小结

    进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时运行多个进程,由于 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();

                    }

           }

}

}


多线程总结