用一个实例介绍Java多线程

来源:互联网 发布:淘宝信用借贷逾期 编辑:程序博客网 时间:2024/06/02 06:13

用一个实例介绍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:javapublic 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:javamport 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()启动多个线程,它们几乎是同时执行的,不会等到前一个线程执行完才执行下一个。

原创粉丝点击