线程基础

对于编写一些比较大型的程序,要提高运行的性能的时候,经常会使用多线程。那么线程到底是什么呢?

程序,进程与线程的故事

1.程序: 对于这个概念,专业的解释是这样的计算机程序是一组计算机能识别和执行的指令,当然如果感觉很拗口,其实我们可以简单的理解为就是我们用的一些软件,譬如qq,微信,我们用的IDE ecilipse等等。程序一般由算法、数据、代码、资源文件、…组成的。
2.进程: 程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程,
3.线程 : 线程是指程序在执行过程中,能够执行程序代码的一个执行单元,是进程中一个独立运行单位。

	从你创建一个线程,到最后任务执行完毕,这就是一个线程的生命周期。

线程的一个生命周期包括:创建启动执行暂停等待休眠停止

类别存在(执行)位置
程序硬盘
进程内存
线程CPU上执行

为什么要用多线程(意义)

  • 使用多线程减少了程序的响应时间。单线程如果遇到等待或阻塞,将会导致程序不响应鼠标键盘等操作,使用多线程可以解决此问题。
  • 多核CPU及计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算资源,造成资源的巨大浪费。
  • 多线程可以简化程序的结构,使程序便于维护,一个非常复杂的进程可以分为多个线程执行。

JAVA实现多线程

  1. Runnable 接口(implements)
  • 需要重写方法:run(){ }
  1. 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);
	}
}

这样代码运行起来似乎就像是一个简陋的烟花绽放的过程
线程动画

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值