何谓线程,线程是进程中某个单一顺序的控制流,也被称为轻量进程。计算机科学术语,指运行中的程序的调度位。
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。也可是被main方法调用的初始化方法中的线程。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
前面我们提到过使用线程的利弊有:
1.好处: ·
1)可以把占据长时间的程序中的任务放到后台去处理。 ·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 3)程序的运行速度可能加快。 ·4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
2.缺点:
总的来说关于线程的使用,要在恰当的情况下,特别是多线程的使用,不能一味求快而盲目多加线程。
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;
}
}