第8章线程多线程编程是提高应用程序性能的重要手段之一。Java平台从开始就被设计成为多线程环境,从语言级上支持多线程。在Java语言中,提供了创建、启动、调度、同步等各种线程管理方法,下面会进行详细介绍。8.1什么是线程多线程编程的目的是最大限度地利用CPU资源。当某一线程的处理不需要占用CPU,而只和I/O、内存等资源打交道时,让需要占用CPU资源的其他线程有机会获得CPU资源。要掌握多线程编程,需要弄清如下两个区别。1.进程与线程的区别最初在Unix等多用户、多任务操作系统环境下,为了提高操作系统的并行性和资源利用率,提出了进程的概念。进程首先是个动态的过程,是程序的一次执行。进程用于表示应用程序在内存环境中执行的基本单元,通常有如下一些特点。进程是操作系统环境中的基本成分、是系统资源分配的基本单位。进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间。进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型。1.进程与线程的区别从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。随着对计算能力需求的不断增长,计算机系统中的资源也显得越发宝贵。频繁的进程状态切换会消耗大量的系统资源,为解决此问题,提出了线程的概念。线程仍然是处理器调度的基本单位,但不再是资源分配的单位。线程的状态切换比进程切换的负担要小得多。Java语言从开始就被设计成为多线程环境,从语言级别上支持多线程。2.线程对象和线程的区别另一个重要的区别是线程对象和线程的区别。线程对象是指可以产生线程的对象,如在Java语言中的Thread对象、Runnable对象。线程是指正在执行的一个指令序列。在Java语言中是指从一个线程对象的start()方法执行开始,运行run()方法体中的那一段相对独立的过程。对线程概念有了基本认识之后,下面章节就详细介绍Java语言中的多线程编程方法。8.2使用线程要想执行一个线程,首先需要对其进行创建和启动。线程的创建完成线程的定义,实现线程执行时所需完成的功能;线程的启动是对实例化的线程进行启动,使其获得执行的机会。对这两部分内容,下面分别进行介绍。8.2.1创建线程要使用线程,首先需要创建线程。在Java语言中,创建线程有两种方式,可以继承java.lang.Thread类或者实现Runnable接口。下面对这两种创建方式分别进行介绍。1.继承Thread类Java语言中定义了线程类Thread。用户可以通过继承Thread类,覆盖其run()方法创建自己的线程类。通常继承Thread类创建线程的语法格式如图8.1所示。classClassNameextendsThread{publicvoidrun(){//线程执行代码}}线程名称继承于Thread类覆盖run()方法2.实现Runnable接口另一种创建线程类的方式是实现Runnable接口。如果自定义的线程类还要继承其他类,这时就不能采用第一种方式来创建。由于Java语言不支持类的多继承,却可以实现多个接口,所以这种情况可以采用实现Runnable接口的方式创建。通常实现Runnable接口创建线程的语法格式如图8.2所示。classClassNameimplementsRunnable{publicvoidrun(){//线程执行代码}}线程名称实现Runnable接口覆盖run()方法8.2.2启动线程线程创建完成后,通过线程的启动来执行线程。类Thread定义了start()方法用来完成线程的启动。针对两种不同的线程创建方式,下面分别介绍其启动方法。1.继承Thread类方式线程的启动继承Thread类方式的线程启动非常简单,只要创建线程类实例后调用其start()方法即可。启动线程的语法格式如图8.3所示。start()方法是类Thread定义的方法,通常不建议对其覆盖。ThreadClassThreadInstance=newThreadClass();ThreadInstance.start();线程类线程实例启动线程2.实现Runnable接口线程的启动实现Runnable接口创建的线程首先转换为Thread类,然后调用Thread类的start()方法启动线程。通常将实现了Runnable接口创建的线程类实例作为构造方法参数,使用Thread的构造方法转换为Thread类。启动线程的语法格式如图8.4所示。...