文章目录
什么是多线程
在实际生活中,总是有许多事情在同时进行:餐馆里厨师做饭时一边调火,一边炒菜;我们一边呼吸,一边思考等等。如果一个程序只能按照顺序执行,那么它的效率可能非常低下,资源不能得到合理的配置。
在程序中,将每一个需要完成的事件称作一个线程,并发执行多个事件就叫做多线程。
继承Thread类实现多线程
Thread类属于Java.lang包,将这个类实例化得到的对象属于线程。
Thread类有两个常见构造方法:
public 类名 () //创建新的线程对象
public 类名 (String name)//创建名为name的线程对象
一个类通过继承Thread类,再实例化这个类的对象就能创建一个新的线程。
Thread类中有一个run()方法,需要线程执行的语句就写在run()方法里,创建线程对象后通过调用start()方法就能执行。
public void run()
下面以创建一个移动的小球为例来说明多线程:
动画实际上是人眼的视觉残留效果,要绘制一个移动的小球,其实就是不断绘制小球并不断擦除之前的小球。
这就需要绘制小球和擦出小球同时进行,需要两个线程。
import javax.swing.*;
import java.awt.Graphics;
import java.awt.FlowLayout;
public class moveF extends javax.swing.JFrame{
//显示窗体
public void showUI(){
JButton start = new JButton("start");
this.setSize(500,500);
FlowLayout flow = new FlowLayout();
this.setLayout(flow);
this.setVisible(true);
this.add(start);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Graphics g = this.getGraphics();
BallListener blr = new BallListener(g);
start.addActionListener(blr);
//创建清除窗体线程对象
Clean cl = new Clean(g);
//执行清除线程对象的run方法
cl.start();
}
}
import java.awt.event.*;
import java.awt.Graphics;
public class BallListener implements ActionListener,BallSize{
private Graphics g;
public BallListener(Graphics g) {
this.g = g;
System.out.println(g);
}
//实现点击按钮绘制一个运动小球
public void actionPerformed(ActionEvent e) {
//创建绘制小球的线程对象
BallThread bt = new BallThread(g);
//执行绘制小球线程对象的run()方法
bt.start();
}
public class BallThread extends Thread implements BallSize{
private Graphics g;
public BallThread(Graphics g) {
this.g = g;
}
//绘制小球线程的方法
public void run() {
//随机取一个纵坐标作为小球的起点
double y1 = Math.random()*200 + y0;
int y = (int)y1;
int flag = 0;
int tempx = 0;
for(int i = 0;i<400;i++) {
int x = x0 + i*OFFSET;
tempx = x;
//绘制小球
g.fillOval(x,y, radiu, radiu);
//控制绘制的速度
try {
Thread.sleep(60);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Clean extends Thread implements BallSize{
private Graphics g;
public Clean(Graphics g)
{
this.g = g;
}
public void run() {
while(true) {
//清除屏幕
for(int i=0;i<50;i++) {
g.clearRect(x0, y0, 450, 430);
//清除屏幕时间
try {
Thread.sleep(120);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class Movemain {
//主方法
public static void main(String[] args) {
// TODO Auto-generated method stub
moveF a = new moveF();
a.showUI();
}
}
当需要一个线程一直执行时,通常会在run()方法中添加while(true)语句。
线程的其他操作以及线程同步等内容在接下来的学习过程中我会进行补充。