java零基础学习指南程序设计课件10新多线程_第1页
java零基础学习指南程序设计课件10新多线程_第2页
java零基础学习指南程序设计课件10新多线程_第3页
java零基础学习指南程序设计课件10新多线程_第4页
java零基础学习指南程序设计课件10新多线程_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象的语言程序设计Java主讲:

多线程第10章线程的概念线程的创建线程的状态内容提要:线程的调度线程的同步10多线程进程与线程

一个被调入内存,并且正在被执行的程序,称为进程,一个进程可以有多个线程。是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。不同进程的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。10.1线程的基本概念以前所编写的程序,每个程序都有一个入口、一个出口以及一个顺序执行的序列,在程序执行过程中的任何指定时刻,都只有一个单独的执行点。事实上,在单个程序内部是可以在同一时刻进行多种运算的,也就是说同时有多个指令序列在执行,这就是所谓的多线程(这与多任务的概念有相似之处)。10.1线程的基本概念一个单独的线程和顺序程序相似,也有一个入口、一个出口以及一个顺序执行的序列,从概念上说,一个线程是一个程序内部的一个顺序控制流。线程并不是程序,它自己本身并不能运行,必须在程序中运行。在一个程序中可以实现多个线程,这些线程同时运行,完成不同的功能。10.1线程的基本概念启动5个线程10.1线程的基本概念一个文件分成五块,每块启动一个线程来下载10.1线程的基本概念减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)。程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)。10.1.1多线程的意义有若干个控制序列,能够同时运行几个独立的动作,提高了应用程序的运行速度。有(多个处理器+多处理器操作系统)的系统,可以并发运行不同的线程。单处理器系统由操作系统按时间片轮转方式和独占方式来分配线程的执行时间(减少CPU的空闲时间),由于CPU的执行速度比较快,看起来就象几个线程在同时运行。10.1.1多线程的意义10.1.2线程的优先级和分类每一个线程都会分配一个优先级,优先级越高,系统优先调度执行。Java将线程的优先级分为10个等级,用数字1~10表示,数字越大优先级越高,默认的优先级是居中,即为5。

MIN_PRIORITY

//1最小优先级

MAX_PRIORITY//10

最大优先级

NORMAL_PRIORITY

//5

普通优先级10.1.2线程的优先级和分类线程分为两类,用户线程和守护线程(Daemon,也叫后台线程),守护线程具有最低的优先级,用于为系统中其他对象和线程提供服务,如系统资源自动回收线程。

线程是程序内部的一个顺序控制流,它具有一个特定的生命周期。在一个线程的生命周期中,它总处于某一种状态中。线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务。10.1.3线程的生命周期

新建

就绪

运行

死亡

堵塞

10.1.3线程的生命周期线程的5个状态1:新建状态NewBorn2:就绪状态Runnable3:运行状态Running4:阻塞状态Blocked4:死亡状态Dead10.1.3线程的生命周期1.新建状态(newThread)

当创建了一个新的线程时(Threadthd=newThread();

),它就处于创建状态,此时它仅仅是一个空的线程对象,系统不为它分配资源。处于这种状态时只能启动或终止该线程,调用除这两种以外的其它方法都会失败并且会引起非法状态例外IllegalThreadStateException(对于其它状态,若所调用的方法与状态不符,都会引起非法状态例外)。10.1.3线程的生命周期2.就绪状态(Runnable)

当线程处于创建状态时,可以调用start()方法(thd.start();)来启动它,产生运行这个线程所需的系统资源,安排其运行,并调用线程体run()方法,这样就使得该线程处于可运行(Runnable)状态。

10.1.3线程的生命周期2.就绪状态(Runnable)

需要注意的是这一状态并不是运行中状态(Running),因为线程也许实际上并未真正运行。由于很多计算机都是单处理器的,所以要在同一时刻运行所有的处于可运行状态的线程是不可能的,Java运行系统必须实现调度来保证这些线程共享处理器。当一个线程正在运行时,它是可运行的,并且也是当前正运行的线程。10.1.3线程的生命周期3.运行状态(Running)

线程获得了CPU资源正在执行任务,此时除非它自动放弃CPU资源或者有更高级的线程进入,线程将一直运行到结束。10.1.3线程的生命周期4.阻塞状态(Blocked)当下面四种情况发生,线程就进入阻塞状态:调用了sleep()方法;调用了suspend()方法;为等候一个条件变量,线程调用wait()方法;输入输出流中发生线程阻塞。10.1.3线程的生命周期4.阻塞状态(Blocked)

对于这四种使得线程处于不可运行状态地情况,都有特定的方法使线程返回可运行状态:如果线程处于睡眠状态中,sleep()方法中的参数为休息时间,当这个时间过去后,线程即为可运行的;如果一个线程被挂起,须调用resume()方法来返回;10.1.3线程的生命周期4.阻塞状态(Blocked)如果线程在等待条件变量,那么要停止等待的话,需要该条件变量所在的对象调用notify()或notifyAll()方法;如果在I/O流中发生线程阻塞,则特定的I/O指令将结束这种不可运行状态。10.1.3线程的生命周期需要注意的是每种方法都仅仅对相应的情况才有作用,例如当一个线程睡眠并且睡眠时间还没有结束时,调用resume()方法是无效的,并且还会引起非法状态例外。10.1.3线程的生命周期5.死亡状态(Dead)

线程的终止(进入死亡状态)一般可通过两种方法实现:自然撤消或是被停止。自然撤消是指从线程的run()方法正常退出;调用线程的方法stop()则可以强制停止当前线程。10.1.3线程的生命周期newThread()NewbornRunnablestart()NotRunnablestop()stop()Deadyield()stop()run()exit..suspend()sleep()wait()I/O流阻塞resume()notify()/notifyAll()I/O指令.10.1.3线程的生命周期

Java的线程是通过Java的软件包Java.lang中定义的类Thread来实现的。当生成一个Thread类的对象之后,就产生了一个线程,通过该对象实例,可以启动线程、终止线程、或者暂时挂起它等。10.2线程的创建线程所执行的代码(或者说线程所要完成的功能)是通过方法run()(包含在一个特定的对象中)来完成的,方法run()称为线程体。在一个线程被建立并初始化以后,Java的运行时系统就自动调用run()方法,正是通过run()方法才使得建立线程的目的得以实现。

通常,run()方法会执行一个时间较长的操作,例如下载并播放一个MPEG格式的电影。10.2线程的创建1、构造方法Thread类的构造方法很多,主要包括:n

Thread();n

Thread(Runnabletarget);Thread(Runnabletarget,Stringname);Thread(Stringname);10.2.1Thread线程类2、主要方法nintactiveCount()//返回当前活动线程数nThreadcurrentThread()//返回当前运行的线程nStringgetName()//返回线程的名字destroy()//破坏线程,但不进行清理intgetPriority()//返回线程的优先级ThreadGroupgetThreadGroup()//返回线程组名

10.2.1Thread线程类方法一:Thread

继承类Thread并重写其中的方法run()。方法二:Runnable

使用Runnable接口。10.2.2线程的创建1、继承Thread类创建线程

一般包括四步:从Thread类派生一个类,extends并覆盖Thread类中的run方法创建该子类的对象调用start方法启动本线程10.2.2线程的创建Page186例10-1ThreadDemo1.javaPage187例10-2ThreadDemo2.java2、实现Runnable接口

提供一个实现接口Runnable的类作为线程的目标对象。在初始化一个Thread类或子类生成线程实例时,把目标对象传递给这个线程实例,由该目标对象提供线程体run()方法。这时,实现接口Runnable的类还可以再继承其他类。10.2.2线程的创建实现Runnable接口建立多线程的步骤1.定义一个实现了Runnable接口的类2.重载方法Run(),3.创建该类的一个实例,作为目标对象传给4new4.创建Thread类的一个实例,new5.启动线程start()10.3线程的创建Page188例10-3ThreadDemo3.java10.3线程的同步与死锁同一个进程的多个线程共享同一内存空间,而线程调度是抢占式的,这样就会带来冲突问题。

比如:有一个银行帐号,存款余额是8000元,用户A持有信用卡,用户B持有存折,如果同一时间都要求取款5000元,我们看会出现什么情况。10.3线程的同步与死锁时间片A信用卡B存折T1取5000T2取5000T3更新8000-5000=3000T4更新:3000-5000=-2000取款的步骤分为两步1:取款2:更新帐户余额10.3线程的同步与死锁产生负数余额的原因是:取款过程的两步分开执行。针对这个问题,我们可以将取款过程的两个动作锁定,即放入同步代码中,直到两步都执行完才能允许其他线程执行,这就是线程的同步。

Java提供了同步方法和同步代码块两种处理方式。synchronized

voidmyMethod(){//Mothodbody}

线程A在执行一个同步方法前,必须获得相应对象或类的锁,如果同时另外一个线程B正在执行这个同步方法,则线程A将被阻塞。这种同步机制确保了同一时刻对于同一个类的不同对象,synchronized方法成员至多有一个处于运行状态,避免了对资源的冲突访问。10.3.1Synchronized同步方法10.3.1Synchronized同步方法Page190例10-4ThreadSyncDemo1.java

synchronized(myObject){//Functionalitythatneed//tosynchronized}synchronized同步块中的代码必须获得syncObject(可以是类或者实例)的锁后才能执行,管理机制与同步方法相同。10.3.2Synchronized同步代码块10.3.2Synchronized同步代码块Page190例10-5ThreadSyncDemo.java

Threadx

Synchronized

A.m1()

Synchronized

B.m1()

Thready

Synchronized

B.m1()

Synchronized

A.m1()

locked

10.3.3线程序的死锁线程同步解决了资源访问的冲突问题,但也可能引起死锁问题。在两个线程对两个同步对象具有循环依赖时会产生死锁。10.3.3线程序的死锁JA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论