继承Thread类
第8章 多线程程序设计
8.1 线程概述
程序的运行叫进程,计算机上同时运行多个程序叫进程并发。在Windows下复制一个活动盘内容到计算机固定硬盘上,用户可以同时进行Word文档处理。这种情况下,用户可以直观地感觉到两个程序同时运行。“同时”是指程序启动后,都处于运行而没有结束的状态。
计算机系统一般只有一个CPU,为了一个高速的CPU可以同时运行多个程序,操作系统按照一定的策略(优先级、循环等)轮流运行每个进程,调度各个进程执行,以最大限度有效地利用计算机的各种资源,这就是所谓的操作系统进程调度。
在一个程序(主程序)内部,有时也需要它的几个程序段同时运行,每个程序段的并发运行叫线程。这些线程与主线程共享代码空间及其他资源,提高了程序并行运行的效率。
多线程程序设计是指单个程序包含并发执行的程序段,如图8-1所示。当多线程程序执行时,该程序对应的进程(主线程)中就有多个控制流在同时运行,即具有并发执行的多个线程。在一个进程中包含并发执行的多个控制流,这就是多线程程序设计。
图8-1 多线程示意图
多线程技术用途很多。典型例子有:网页动画设计中,多个画面同时运动;网络服务器创建一个新的线程来响应网络用户请求,从而并发执行多个服务线程,提高服务效率。
Java运行环境中主程序运行时对应的“进程”,习惯称其为主线程。下面介绍如何编程实现启动、运行、控制多个线程。
实现线程有两种方法:继承Thread类和实现(implements)Ruannable接口。
8.1.1 继承Thread类
线程描述相对独立的程序段的运行,它具有操作系统中进程的许多相同特征:它必须有对应运行的程序段;为了在系统中识别线程,它有惟一的命名;线程运行中,由于不同事件的影响,使它处于不同状态,因此必须有控制线程状态变化的各种方法;逻辑上相关的不同线程构成一个线程组,线程组又可以成为线程保护的一道屏障。Java语言包中的 Thread类就是完成线程运行的程序段的定义、线程状态的控制。
Thread类是Java语言包中的一个可重用类。Thread对象代表Java程序中单个的运行线程。Thread实现了Runnable接口,Runnable接口定义run()方法,该方法中包含了运行时执行的代码。一个类通过继承Thread类,同时重写其run()方法,就可以实现多线程的方式运行,并继承Thread类的所有方法。Run()方法是运行线程的主体,启动线程时,由Java直接调用run()方法。
例8-1 继承Thread类, 实现一个定时线程,即线程在给定期间每隔一定时间(1秒),屏幕显示时间累计数(秒数),时间结束时线程自动停止、撤销。
package cha8;
public class Timer1 extends Thread //定时类Timer继承Thread类
{ static int stop=20;
int time=0; //定时的时间间隔,变量初始化值为0秒
public Timer1(int time)
/* Timer类构造方法,构造方法的参数为需要定时的时间(单位为秒)*/
{
this.time=time;
}
public void run()
//Timer重写父类Thread 的方法run(),这是该线程运行的程序段
{ try
{for(int i=0;i<stop;i++ )
{
Thread.sleep(1000);
//线程睡眠1秒,这期间它不执行,好像停止在这一样
System.out.println(“time=”+i*time);
//屏幕显示i值,i表示时间间隔数,这里表示秒数
}
}
catch(Exception e) //捕获异常
{
System.out.println(e.toString()); //异常处理,屏幕显示异常信息
}
}
public static void main(String args[]) { //主线程对应的运行程序
Timer1 timer1=new Timer1(10);
//构造Timer的对象timer1,即一个线程。设置定时10秒
Timer1 timer2=new Timer1(5);
//构造Timer的对象timer2,即另一个线程,设置定时5秒
timer1.start(); //启动线程timer1运行
timer2.start();
//启动线程timer2运行, timer1、timer2两个定时线程同时运行
}
}
在程序执行过程中,两个定时器线程可以独立于主线程运行,并设置自己的运行时间限制。