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