-第十三章并发课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《-第十三章并发课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十三 并发 课件
- 资源描述:
-
1、第十三章第十三章 并发并发1线程的概念线程的概念线程的创建线程的创建线程调度与线程控制线程调度与线程控制线程同步线程同步线程状态与生命周期线程状态与生命周期2?什么是线程什么是线程?多线程是实现并发的一种有效手段。多线程是实现并发的一种有效手段。?一个进程可以通过运行多个线程来并发地执行多项任务。一个进程可以通过运行多个线程来并发地执行多项任务。?多个线程如何调度执行由系统来实现。多个线程如何调度执行由系统来实现。3什么是线程什么是线程?线程是程序中的单个执行流,多线程是一个程序线程是程序中的单个执行流,多线程是一个程序 中包含中包含的多个同时运行的执行流。的多个同时运行的执行流。4线程与进程
2、线程与进程?进程:内核级的实体。包含虚存映象、文件指示符,进程:内核级的实体。包含虚存映象、文件指示符,用户用户ID等。这些结构都在内核空间中,用户程序等。这些结构都在内核空间中,用户程序只有通过系统调用才能访问与改变。只有通过系统调用才能访问与改变。?线程:用户级的实体。线程结构驻留在用户空间中,线程:用户级的实体。线程结构驻留在用户空间中,能够被普通的用户级函数组成的线程库直接访问。能够被普通的用户级函数组成的线程库直接访问。寄存器(栈指针,程序计数器)是线程专有的成分。寄存器(栈指针,程序计数器)是线程专有的成分。?一个进程中的所有线程共享该进程的状态。一个进程中的所有线程共享该进程的状
3、态。5Java中的线程中的线程?Java 中线程被认为是一个中线程被认为是一个CPU、程序代码、和数据、程序代码、和数据的封装体。的封装体。CPU?一个虚拟的一个虚拟的CPU,?该该CPU执行的代码:执行的代码:CodeData代码与数据是相互独立的,代代码与数据是相互独立的,代码可以与其它线程共享。码可以与其它线程共享。?代码所操作的数据:数据也可以代码所操作的数据:数据也可以被多个线程共享。被多个线程共享。6线程的构造线程的构造?Java.lang.Thread类使用户可以创建和控制自己的线程。类使用户可以创建和控制自己的线程。?在在Java中,虚拟中,虚拟CPU是自动封装进是自动封装进T
4、hread类的实例中,类的实例中,而而Code和和Data要通过一个对象传给要通过一个对象传给Thread类的构造函数。类的构造函数。7线程的创建线程的创建?线程的线程的Code和和Data构成线程体。线程体决定了线程的行为。构成线程体。线程体决定了线程的行为。?Java中线程体由中线程体由Thread类的类的 run()方法定义,该方法方法定义,该方法定义了线程的具体行为并指定了线程要操作的数据。定义了线程的具体行为并指定了线程要操作的数据。?有两种方式进行有两种方式进行run()方法的定义:方法的定义:?实现实现 Runnable 接口接口?继承继承Thread 类类8通过实现通过实现Ru
5、nnable 接口创建线程接口创建线程?Runnable 接口只提供了一个接口只提供了一个public void run()方法。方法。?定义一个类实现定义一个类实现Runnable接口。接口。?将该类的实例作为参数传给将该类的实例作为参数传给Thread类的一个构造函数,类的一个构造函数,从而创建一个线程。从而创建一个线程。9线程创建示例线程创建示例Public class ThreadTestpublic static void main(String args)Xyz r=new Xyz();Thread t=new Thread(r);t.start();Class Xyz imple
6、ments Runnableint I;public void run()while(true)System.out.println(“Hello”+I+);if(I=5)break;10线程创建示例线程创建示例线程线程 tCPU一个线程就是一个线程就是Thread类的一个实例。类的一个实例。线程是从一个传递给线程的线程是从一个传递给线程的Runnable实例的实例的run()方法开始执行。方法开始执行。线程所操作的数据是来自于该线程所操作的数据是来自于该Runnable 类的实例。类的实例。CodeDataXyz类类Xyz的实例的实例 r 11通过继承通过继承Thread类创建线程类创建线程
7、?Thread 类本身实现了类本身实现了Runnable接口。接口。?通过继承通过继承Thread类,重写其中的类,重写其中的run()方法定义线程体。方法定义线程体。?创建该子类的对象创建线程。创建该子类的对象创建线程。Public class Counter extends Threadpublic void run()创建与运行线程:创建与运行线程:Counter ThreadCounter=new Counter();ThreadCounter.Start();12线程两种创建方法比较线程两种创建方法比较?实现实现Runnable接口的优势:接口的优势:?符合符合OO设计的思想。设计的
8、思想。?便于用便于用extends继承其它类。继承其它类。?采用继承采用继承Thread类方法的优点:程序代码更简单。类方法的优点:程序代码更简单。?提倡采用第一种方式。提倡采用第一种方式。13线程的运行线程的运行?新创建的线程不会自动运行。必须调用线程的新创建的线程不会自动运行。必须调用线程的start()方法方法,如:如:t.start()?该方法的调用把嵌入在线程中的虚拟该方法的调用把嵌入在线程中的虚拟CPU置为可运行置为可运行(Runnable)状态。状态。?Runnable状态意味着该线程可以参加调度,被状态意味着该线程可以参加调度,被JVM运行,运行,并不意味着线程会立即执行。并不
9、意味着线程会立即执行。14线程调度与线程控制线程调度与线程控制?线程调度策略线程调度策略?线程的基本控制线程的基本控制15线程调度策略线程调度策略?Java中线程调度采用抢先式调度方法。中线程调度采用抢先式调度方法。?抢先式调度模式:抢先式调度模式:许多线程可能是可运行的,但只能有一个线程在运行。许多线程可能是可运行的,但只能有一个线程在运行。该线程将持续运行,直到它自行中止或出现高优先级该线程将持续运行,直到它自行中止或出现高优先级线程成为可运行的,则该低优先级线程被高优先级线程线程成为可运行的,则该低优先级线程被高优先级线程强占运行。强占运行。?线程中止的原因可能有多种,如执行线程中止的原
10、因可能有多种,如执行Thread.sleep()调用,调用,或等待访问共享的资源。或等待访问共享的资源。16线程的优先级线程的优先级?每个线程都有优先级,有缺省值,可用每个线程都有优先级,有缺省值,可用SetPriority()方法改变。方法改变。?每个优先级有一个等待池:每个优先级有一个等待池:t1t2t3.poolpoolpool17线程调度策略线程调度策略?JVM先运行高优先级池中的线程,待该池空后才先运行高优先级池中的线程,待该池空后才考虑低优先级线程。考虑低优先级线程。?如果有高优先级线程成为可运行的,则运行它。如果有高优先级线程成为可运行的,则运行它。?抢先式可能是分时的,即每个池
11、中的线程轮流运行;抢先式可能是分时的,即每个池中的线程轮流运行;也可能不是,即线程逐个运行,由也可能不是,即线程逐个运行,由JVM而定。而定。?线程一般可用线程一般可用sleep()保证给其他线程运行时间。保证给其他线程运行时间。18线程的基本控制线程的基本控制?结束线程结束线程?获取当前线程获取当前线程?测试线程测试线程?sleep()?join()?yield()19结束线程结束线程?线程完成运行并结束后,将不能再运行。线程完成运行并结束后,将不能再运行。?除正常运行结束外,还可用其他方法控制使其停止。除正常运行结束外,还可用其他方法控制使其停止。?用用stop()方法。方法。强行终止线程
12、,容易造成线程的不一致。强行终止线程,容易造成线程的不一致。?使用标志使用标志flag。通过设置通过设置flag 指明指明run()方法应该结束。方法应该结束。20结束线程结束线程class Xyz implements Runnableprivate boolean timeToQuit=false;public void run()while(!timeToQuit)/clean up before run()ends.public void stopRunning()timeToQuit=true;public class ControlThreadpublic void main(St
13、ring args)Runnable r=new Xyz();Thread t=new Thread(r);t.start();r.stopRunning();21获取当前线程获取当前线程Thread 类的静态方法类的静态方法currentThread()返回当前线程。返回当前线程。22测试线程测试线程当线程的状态未知时,用当线程的状态未知时,用isAlive()确定线程是)确定线程是否活着。返回否活着。返回true 意味着线程已经启动,但还没有意味着线程已经启动,但还没有运行结束。运行结束。23Sleep()方法方法?该方法用来使一个线程暂停运行一段固定的时间。该方法用来使一个线程暂停运行一
14、段固定的时间。在线程睡眠时间内,将运行别的线程。在线程睡眠时间内,将运行别的线程。?Sleep()结束后,线程将进入结束后,线程将进入Runnable状态。状态。24join()方法方法t.join()方法使当前的线程等待,直到方法使当前的线程等待,直到 t 结束为止,线程结束为止,线程恢复到恢复到runnable状态。状态。Public void doTask()TimerThread tt=new TimerThread(100);tt.start();/Do stuff in parallel with the other thread for a while/Wait here for
15、 the timer thread to finishtrytt.join();catch(InterruptedException e)/tt came back early/continue in this thread25yield()方法方法?调用该方法将调用该方法将CPU让给具有与当前线程相同优先级让给具有与当前线程相同优先级的线程。的线程。?如果没有同等优先级的线程是如果没有同等优先级的线程是Runnable状态,状态,yield()方法将什么也不做。方法将什么也不做。26线程同步线程同步?线程间同步机制线程间同步机制?线程间的交互线程间的交互wait()和和notify()?不建
16、议使用的一些方法不建议使用的一些方法27多线程并发执行中的问题多线程并发执行中的问题?多个线程相对执行的顺序是不确定的。多个线程相对执行的顺序是不确定的。?线程执行顺序的不确定性会产生执行结果的不确定性。线程执行顺序的不确定性会产生执行结果的不确定性。?在多线程对共享数据在多线程对共享数据 操作时常常会产生这种不确定性。操作时常常会产生这种不确定性。28多线程并发执行中的问题多线程并发执行中的问题一个堆栈类:一个堆栈类:public class MyStackprivate int idx=0;private char data=new char6;public void push(char
展开阅读全文