第13章 多线程
13.1 多线程简介
每个独立运行的程序称为一个进程(Process)。
进程也称任务,所以支持多个进程同时执行的操作系统被称为多进程操作系统或多任务操作系统。
多进程运行由操作系统来实现。
在一个程序内部也可以实现多个任务并发执行,其中每个任务成为线程(Thread),既线程是指同一个程序(进程)内部每个单独的流程。
线程是比进程更小的执行单位,线程就是一条控制流,线程不能单独存在,存在于进程内。
多线程优势:1、提高界面程序的响应速度。
2、充分利用系统资源。
13.2 多线程的实现
在实际实现线程时,Java语言提供了3种实现方式:
1、 继承Thread类
public DemoThread1(String str){
super(str);
}
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
DemoThread1 dt=new DemoThread1("线程一");//线程处于新建状态下
DemoThread1 dt1=new DemoThread1("线程二");
dt.start();//父类中的方法,启动线程,----线程处于就绪状态 dt在就绪队列中去等待CPU空暇
dt1.start();
for(int i=0;i<10;i++){
System.out.println("main"+i);
Thread.sleep(1000);//线程休眠一秒钟,让出CPU资源,休眠时间到,就处于就绪状态去等待CPU空闲
}
System.out.println("main结束");
}
//线程完成任务的代码放在run方法中
public void run(){
for(int i=0;i<10;i++){
System.out.println(this.getName()+":"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.getName()+"结束");
}
2、 实现Runnable接口
好处:实现Runable接口的方法避免了单继承的局限性。
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
System.out.println("线程"+":"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("线程"+"结束");
}
对于同一个线程类,也可以启动多个线程。
Thread2 t2 = new Thread2(); t2.start();
Thread2 t3 = new Thread2(); t3.start();
同一个线程不能启动两次,例如
Thread2 t2 = new Thread2();
t2.start(); t2.start(); //错误
线程的生命周期
线程是一个动态执行的过程,它也有一个从产生到死亡的过程,这就是所谓的生命周期。一个线程在它的生命周期内有5种状态
新建(new Thread):Thread t1=new Thread();
就绪(runnable):t1.start();
运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
ü 自然终止:正常运行run()方法后终止
ü 异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
ü 正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
ü 正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
ü 被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
实现电子时钟的图形化界面:
public class TimeShow extends Frame implements Runnable {
//时钟的图形化界面
Label lbl;
public TimeShow(){
lbl=new Label();
add(lbl);
setSize(400,200);
setVisible(true);
}
public static void main(String[] args) {
TimeShow ts=new TimeShow();
Thread th=new Thread(ts);
th.start();
}
public void run(){
while(true){
Date d=new Date();
lbl.setText(d.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}