?
何谓线程,线程是进程中某个单一顺序的控制流,也被称为轻量进程。计算机科学术语,指运行中的程序的调度位。???????
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
?
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。也可是被main方法调用的初始化方法中的线程。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
前面我们提到过使用线程的利弊有:
1.好处:?·
1)可以把占据长时间的程序中的任务放到后台去处理。 ·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 3)程序的运行速度可能加快。 ·4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
2.缺点:
?????? 1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。2)更多的线程需要更多的内存空间。3)线程可能会给程序带来更多“bug”,因此要小心使用。4)线程的中止需要考虑其对程序运行的影响。5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。public class ThreadTest extends Thread {
/**
* 重写run()方法 JVM会自动调用该方法
*/
public void run() {
System.out.println("调用run方法!");
}
}
??????线程启动:
ThreadTest1 tt = new ThreadTest1(); tt.start();???2)通过实现Runnable接口
public class ThreadTest implements Runnable{
/**
* 通过实现 Runnable接口创建线程
*/
public void run() {
System.out.println("调用run方法!");
}
}
?线程启动:
ThreadTest2 tt = new ThreadTest2(); Thread t = new Thread(tt); t.start();? 线程使用实例:
package 线程入门;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Game {
private JFrame jf;
public void initUI(){
//实例化一个窗体对象,并设置一些相关属性
jf = new JFrame();
jf.setSize(500, 500);
jf.setLayout(new FlowLayout());
jf.setDefaultCloseOperation(3);
//添加一个按钮
JButton btn = new JButton("ok");
btn.addActionListener(l);
jf.add(btn);
jf.setVisible(true);
}
ActionListener l = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MyThread t = new MyThread(jf);
//启动线程
t.start();
}
};
//main方法
public static void main(String[] args) {
new Game().initUI();
}
}
?
package 线程入门;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
/**
* 定义一个MyThread类
* @author Administrator
*
*/
public class Ball extends Thread{
//定义需要用到的一些属性
private JFrame jf ;
private int x,y;
private int vx=1,vy=2;
private int radius = 30;
private Color color;
private boolean PauseFlag=false;
private boolean StopFlag=false;
public Ball(){
}
//各属性赋初值
public Ball(JFrame jf){
this.jf = jf;
Random r = new Random();
radius = r.nextInt(20)+10;
vx = r.nextInt(10)+1;
vy = r.nextInt(10)+1;
color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
}
//设置暂停标签的值
public void setFlag(boolean PauseFlag){
this.PauseFlag = PauseFlag;
}
public void run(){
Graphics g = jf.getGraphics();
while(true){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
if(PauseFlag){
continue;
}
//得到窗体的背景颜色
g.setColor(jf.getBackground());
g.fillOval(x, y, radius*2, radius*2);
if(StopFlag){
return;
}
x+=vx;
y+=vy;
if(x<=0 || x > jf.getWidth()-radius*2){
//改变方向
vx = -vx;
}
if(y<=0 || y > jf.getHeight()-radius*2){
vy = -vy;
}
g.setColor(color);
g.fillOval(x, y, radius*2, radius*2);
}
}
//自己实现线程的暂停
public void pause(){
PauseFlag = true;
}
//自己实现线程的暂停之后的再次开始
public void restart(){
PauseFlag = false;
}
//自己实现线程的暂停之后的再次开始
public void stopFlag(){
StopFlag = true;
}
}