对于编写一些比较大型的程序,要提高运行的性能的时候,经常会使用多线程。那么线程到底是什么呢?
程序,进程与线程的故事
1.程序: 对于这个概念,专业的解释是这样的计算机程序是一组计算机能识别和执行的指令,当然如果感觉很拗口,其实我们可以简单的理解为就是我们用的一些软件,譬如qq,微信,我们用的IDE ecilipse等等。程序一般由算法、数据、代码、资源文件、…组成的。
2.进程: 程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程,
3.线程 : 线程是指程序在执行过程中,能够执行程序代码的一个执行单元,是进程中一个独立运行单位。
从你创建一个线程,到最后任务执行完毕,这就是一个线程的生命周期。
线程的一个生命周期包括:创建,启动,执行,暂停,等待,休眠,停止。
类别 | 存在(执行)位置 |
---|---|
程序 | 硬盘 |
进程 | 内存 |
线程 | CPU上执行 |
为什么要用多线程(意义)
- 使用多线程减少了程序的响应时间。单线程如果遇到等待或阻塞,将会导致程序不响应鼠标键盘等操作,使用多线程可以解决此问题。
- 多核CPU及计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算资源,造成资源的巨大浪费。
- 多线程可以简化程序的结构,使程序便于维护,一个非常复杂的进程可以分为多个线程执行。
JAVA实现多线程
- Runnable 接口(implements)
- 需要重写方法:run(){ }
- Thread类(extends)
- 需要重写方法:run(){ };
- 可调用方法:start();sleep();
线程的应用(简单的线程动画)
既然我们已经大概了解了线程的有关知识,以及在JAVA中应该如何实现,何不立马就用线程实现一个小项目呢? 接下来就用线程做一个简单的线程动画吧。
我们要实现的目标是:在界面画出一个小图形,然后让这个图形按照我们想要的规律在屏幕上动起来。
首先要在界面上画出一个图形并不难,运用我们前面做画图板的知识,重写paint方法即可。而要让这个图形动起来,按照以往我们单线程的程序似乎就很难实现了,所以这里我们就需要用到多线程了。请看代码实例:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Demo extends JFrame implements Runnable {
private int x=50,y=50,width = 100,height = 100;//给图形实心圆一个初始位置
public static void main(String []args){
Demo tht = new Demo();
tht.ShowUI();//显示这个界面
Thread thread = new Thread(tht);//传入Runnable参数,调用接口中的run方法
thread.start();//启动线程
}
/**
* 出现一个界面
*/
public void ShowUI(){
this.setTitle("线程动画");
this.setSize(800,900);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setVisible(true);
}
@Override
public void run() {
while(true){
//改变小球的坐标
if(x<601&&y<51) x+=50;
else if(x>549&&y<701) y+=50;
else if(x>49&&y>649) x-=46;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();//调用repaint方法重画小球
}
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.fillOval(x, y, width, height);
}
}
这样一个移动的小球就成功了,小伙伴们可以去试试哦!
(简陋的)代码示例
一个移动的小球写完之后,当然就像写更高级的动画了,小编就写了一个很简陋的烟花,配上简陋的背景图片,如下:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ThreadTest extends JFrame implements Runnable {
private int x=350,y=400,width = 70,height = 70,width1=0,height1=0;//给图形实心圆一个初始位置
private int [] po=new int[]{0,0,0,0,0,0,0,0};
public static void main(String []args){
ThreadTest tht = new ThreadTest();
tht.ShowUI();//显示这个界面
Thread thread = new Thread(tht);//传入Runnable参数,调用接口中的run方法
thread.start();//启动线程
}
/**
* 出现一个界面
*/
public void ShowUI(){
this.setTitle("线程动画");
this.setSize(800,900);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
ImageIcon image=new ImageIcon("src//Thread//01.jpg");
JLabel iconLabel = new JLabel(image);// 创建显示图片的标签,图片要放入标签里面
this.add(iconLabel);
this.setVisible(true);
}
@Override
public void run() {
for(int i=0;i<10;++i){
y-=20;
try {
Thread.sleep(90);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
//改变4个小球的位置
for(int j=0;j<4;++j){
po[j]=365;
po[j+4]=215;
}
width1=60;height1=40;
for(int i=0;i<8;++i){
po[0]-=20;po[4]-=20;
po[1]-=20;po[5]+=20;
po[2]+=20;po[6]-=20;
po[3]+=20;po[7]+=20;
try {
Thread.sleep(90);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.orange);
g.fillOval(x, y, width, height);
g.fillOval(po[0], po[4], width1, height1);
g.fillOval(po[1], po[5], width1, height1);
g.fillOval(po[2], po[6], width1, height1);
g.fillOval(po[3], po[7], width1, height1);
}
}
这样代码运行起来似乎就像是一个简陋的烟花绽放的过程