1、多线程程序设计1.11.1.1 1 线程的概念线程的概念 程序程序 是一段静态的代码,是为完成特定任务,用某种语言编写的一组指令的集合。进程进程 是程序的一次执行过程,对应从代码的加载、执行至执行完毕的一个完整过程。线程线程 是程序中一个单一的顺序控制流程,它是程序运行的基本执行单元。线程是比进程还小的单位。线程有它自己的入口和出口,以及一个顺序执行的序列。线程不能独立存在,必须存在于进程中。1.11.1.1 1 线程的概念线程的概念 1)充分利用充分利用 CPU资源资源2)简化编程模型简化编程模型5 5)节约成本)节约成本4 4)使)使GUI更更 有效率有效率3)简化异步事件简化异步事件 的
2、处理的处理 线程的特点:线程的特点:1.11.1.1 1 线程的概念线程的概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。1.11.1.2 2 线程与进程线程与进程 线程的划分尺度小于进程。进程在执行过程中拥有独立的内存单元,而多个线程只能共享进程的内存单元。在执行过程中,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。1.11.1.2 2 线程与进程
3、线程与进程 一个线程可以创建和撤销另一个线程;同一个进程的多个线程之间可以并发执行。(5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。(4)一个线程从创建、启动到终止的整个过程称作一个生命周期。在此期间的任何时刻,总是处于5中状态中的某一种。1.1.创建创建 状态状态2.2.就绪就绪 状态状态3.3.运运行状态行状态4.4.阻塞阻塞 状态状态5.5.终止终止 状态状态 线程基本状态转换图线程基本状态转换图 1.31.3.1 1 继承继承 Thread 类类 Thread 类综合了
4、Java 程序中一个线程需要拥有的属性和方法。public Thread()创建线程,新建线程采用默认名称 Thread1、Thread2、Threadn(n是整数)。public Thread(String name)创建名称为 name 的线程。public Thread(Runnable target)创建基于实现 Runnable 接口的类对象 target 的线程,新建线程采用默认名称 Thread1、Thread2、Threadn(n是整数)。1.31.3.1 1 继承继承 Thread 类类 public Thread(Runnable target,String name)创建
5、基于实现 Runnable 接口的类对象 target 的线程,新建线程名称为 name。public void start()该线程开始执行;Java 虚拟机调用该线程的 run()方法。public void run()子类必须重写该方法,在其中书写运行本线程将要执行的代码。Deprecated public final void stop()强迫线程停止执行。1.31.3.1 1 继承继承 Thread 类类 Deprecated public final void suspend()将线程挂起,暂停运行,但系统不破环线程的执行环境,可以用 resume()方法来恢复本线程的执行。Dep
6、recated public final void resume()恢复被挂起的线程,进入可运行状态。public final String getName()得到线程名称。public final void setName(String name)设置线程名称。public final int getPriority(得到线程的优先级。public final void setPriority(int newPriority)设置线程的优先级为 newPriority。1.31.3.1 1 继承继承 Thread 类类 public final void join()throws Inter
7、ruptedException等待该线程终止。public static Thread currentThread()返回对当前正在执行的线程对象的引用。public static void yield()暂停当前正在执行的线程对象,执行其他线程。public static void sleep(long millis)throws InterruptedException暂停当前正在执行的线程对象,millis 毫秒后继续执行。线程暂停时,不丢失任何监视器的所属权(Java 虚拟机对线程运行的监视和调度)。定义Thread类的一个子类。定义子类中的 run方法,覆盖父类中的run方法。通过
8、start 方法启动线程。创建该子类的一个线程对象。1.31.3.1 1 继承继承 Thread 类类 1.31.3.2 2 实现实现 Runnable 接口接口 实现 Runnable 接口来编写多线程程序,只需要重写 run 方法。一一二二三三四四定义一个实现Runnable接口的类。定义方法run()。Runnable接口中有一个空的方法run(),实现它的类必须覆盖此方法。创建该类的一个线程对象,并将该对象作参数,传递给Thread类的构造方法,从而生成Thread类的一个对象。通过start()方法启动线程。1.41.4.1 1 线程的优先级与调度线程的优先级与调度 线程调用 run
9、 方法,进入可运行状态。处于可运行状态的线程进入线程队列排队等待 CPU 等资源,根据系统分配给线程的优先级高低进行排队,分配较高的优先级的线程,在可运行态的线程队列中就往前排。对于优先级相同的线程,则遵循队列的“先进先出”原则,即先到的线程先获得系统资源来运行。处于运行状态的线程运行时间只是一个时间片,在这个时间片内,顺序执行该线程的语句。当这个时间片使用完后,该线程让出 CPU 控制权,进入就绪状态(可运行状态),在线程队列最后排队,等待下一个时间片。线程队列上次排在该线程之后的线程得到 CPU 控制权,进入运行状态。以此类推。1.41.4.1 1 线程的优先级与调度线程的优先级与调度 T
10、hread 类也提供了方法 setPriority()来修改线程的优先级。参数取值范围为110。Thread 类提供的优先级静态常量有:NORM_PRIORITY:普通优先级(5)MIN_PRIORITY:最低优先级(1)MAX_PRIORITY:最高优先级(10)线程调度策略:1)协作式2)抢占式1.41.4.1 1 线程的优先级与调度线程的优先级与调度 线程休眠:sleep线程等待:wait yield join 线程让步:1.41.4.2 2 线程的同步机制线程的同步机制 1.1.互斥互斥 程序中的多个线程一般是独立运行的,各个线程有自己的数据和方法。但有时需要在多个线程之间共享一些资源
11、对象,这些资源对象的操作在某些时候必须要在线程间很好地协调,以保证它们的正确使用。不考虑协调性,就可能产生错误。在 Java 语言中,为保证线程对共享资源操作的完整性,用关键字 synchronized 为共享资源加锁来解决这个问题。这个锁使得共享资源对线程是互斥操作的,称为互斥锁。共享资源加锁后,在任何时刻只能被一个线程访问,这个线程是当前操作该共享资源的线程。在其操作过程中,其他线程不能操作这个共享资源。只有当拥有该共享资源的线程执行完对该对象的操作,自动放弃此对象上的线程互斥锁后,其他线程才能获得该锁,对这个共享资源进行操作。1.41.4.2 2 线程的同步机制线程的同步机制 1)修饰语
12、块,对语句块加锁,语句块执行完毕,释放该锁。synchronized(this)语句块;2)修饰方法,对方法加锁,方法执行完毕,释放该锁。public synchronized 返回类型 方法名(参数)3)修饰类,类中所有方法都是互斥资源。1.41.4.2 2 线程的同步机制线程的同步机制 2.2.同步同步 不同线程对共享资源的顺序访问,或者说是对共享资源的同步访问。实现同步需要在这些线程之间相互通信。Java 提供了方法wait、notify 和 notifyAll 来使线程之间相互交谈。一个线程可以进入某一个对象的 synchronized 方法进入等待状态,直到其他线程显式地将它唤醒。可
13、以有多个线程进入同一个方法并等待同一个唤醒消息。java.lang.Object 类的类的 wait()、notify()、notifyAll()方法使用如下:方法使用如下:1.41.4.2 2 线程的同步机制线程的同步机制 public final void wait()throws InterruptedException在其他线程调用此对象的 notify()方法或 notifyAll()方法前,当前线程将等待。public final void wait(long timeout)throws InterruptedException在其他线程调用此对象的 notify()方法或 notifyAll()方法或者在超前指定的时间量 timeout 前,当前线程将等待。public final void notify()唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。1.41.4.2 2 线程的同步机制线程的同步机制 public final void notifyAll()唤醒在此对象监视器上等待的所有线程。直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。谢谢观看!