用一个实例介绍Java多线程

关于什么是线程和进程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。
简单说:线程是进程的子集。我们让多个线程同时工作来提高计算机执行程序的效率。
打开任务管理器就会发现,每一个进程都有很多个进程,比如说QQ会有几十个进程,而某杀毒软件(360)会有几百个进程(⊙﹏⊙这就是为什么配置低的电脑装了杀毒软件会莫名的卡)。
另外要了解的重要的一点:不同进程占用不同的内存空间,而不同的线程共享同一块内存空间。

实现线程的两种方法:调用rannable接口或者继承Thread

java支持单继承和多个接口调用,所以你只需要选用你需要的那一种方式。如果需要调用多个接口的话就用rannable,如果只要继承一个类的话用Thread实现就行。

我用的是Thread,因为下面的ParticleControl类只继承Thread一个类。
接下来要做的就是要根据需要来编写run()函数的内容,这个run()函数实现的是画一条由小圆点连成的运动轨迹。

lang:java 
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.RGBColor;

public class particleControl extends Thread{
    private JFrame tmpjf;

    public particleControl(JFrame jf){
        this.tmpjf=jf;
    }
    public void run() {
        vector2f position=new vector2f(10, 500);//起始位置
        vector2f velocity=new vector2f(100, -100);//速度向量
        vector2f acceleration=new vector2f(0, 20);//合力向量
        double dt=0.1d;

        for (int i = 2; i < 60; i++) {
            position=position.add(velocity.mutiply(dt));
            velocity=velocity.add(acceleration.mutiply(dt));
            Graphics g = tmpjf.getGraphics();
            g.setColor(new Color(300+3*i));
            g.fillOval((int)position.x, (int)position.y, 10, 10);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

下面vector2f 类,表示一个向量。运动轨迹由两个向量决定:速度和合外力

lang:java
public class vector2f {
    public double x,y;
    public vector2f(double x,double y){
        this.x=x;
        this.y=y;
    }
    public vector2f add(vector2f v){
        return new vector2f(x+v.x,y+v.y);
    }
    public vector2f mutiply(double f){
        return new vector2f(x*f,y*f);
    }

}

下面mianUI类,它继承了JFrame类用来显示窗体

lang:java
mport java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class mainUI extends JFrame {
    private JFrame tmpJf = this;
    public void initUI() {
        this.setTitle("群体智能仿真");
        this.setSize(750, 750);
        this.setLayout(new FlowLayout());
        JButton startJbu = new JButton("启动");
        this.add(startJbu);

        tmpJf.getContentPane().setBackground(Color.WHITE);
        this.setVisible(true);
        startJbu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                particleControl pc = new particleControl(tmpJf);
                    pc.start();
            }   
        });
    }

    public static void main(String args[]) {
        mainUI fui = new mainUI();
        fui.initUI();
    }
}

上面有这个demo的所有代码


让线程休眠的方法:在run()方法里面加上Thread.sleep(10);//让线程休眠10ms;

这很好理解,当run()方法执行完它的生命周期就结束了,我们让它在结束之前暂停一段时间就能让调用run()方法的线程休眠。

新建一个线程的方法:particleControl pc = new particleControl(tmpJf);

启动一个线程的方法pc.start();

另外要注意的一点是,如果用pc.run(),就和普通的方法调用没有区别,也就是说用pc.run的时候当线程调用的run()方法执行完毕后才会运行下一个线程。

而pc.start()可以同时启动多个线程,我们可以新建多个线程对象例如pc,pc1,pc2来调用start()启动多个线程,它们几乎是同时执行的,不会等到前一个线程执行完才执行下一个。