教学多线程专业知识讲座省公共课一等奖全国赛课获奖课件_第1页
教学多线程专业知识讲座省公共课一等奖全国赛课获奖课件_第2页
教学多线程专业知识讲座省公共课一等奖全国赛课获奖课件_第3页
教学多线程专业知识讲座省公共课一等奖全国赛课获奖课件_第4页
教学多线程专业知识讲座省公共课一等奖全国赛课获奖课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

java多线程程序设计第1页

程序、进程、线程

多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第2页程序、进程程序:计算机指令集合,一段静态代码,是应用软件执行蓝本。它以文件形式存放在磁盘上。进程:一个独立程序每一次运行称为一个进程,是程序一次动态执行过程,它对应了从代码加载、执行到执行完成一个完整过程,这个过程也是进程本身从产生、发展到消亡过程。作为执行蓝本同一段程序能够被屡次加载到系统不一样内存区域分别执行,形成不一样进程。比如:用word编辑文稿时,同时在另一个窗口下载音乐,这两个独立程序在同时运行,称为两个进程。一个应用程序执行(如java程序)也对应于一个进程。操作系统周期性将CPU切换到不一样任务,分时间片轮番运行每一个进程,而每一个进程都像是连续运行。每一个进程占有自己内存空间。第3页线程线程:比进程更小执行单位,一个进程在其执行过程中能够产生多个线程,形成多条执行线索,每条线索即每个线程也有它本身产生、存在和消亡过程,也是一个动态过程。日常生活中程序、进程和线程:程序:每学期课程表进程:每学期教学活动线程:每门课教学过程一个程序运行后最少有一个进程,一个进程里能够包含多个线程,但最少要包含一个线程。第4页单线程早期在计算机上开发程序大多是单线程,就是一个程序只有一条从头到尾执行线索。我们之前编写程序都是单线程程序,每个程序都有一个入口、一个出口以及一个次序执行序列,在程序执行过程中任何指定时刻,都只有一个单独执行点。第5页多线程多线程是一个进程中多段代码同时并发执行,是指程序中包含多条执行路径。在一个程序中同时运行多个不一样线程来执行不一样任务,即允许单个程序创建多个并行执行任务来完成各自任务。采取多线程,一个进程若干任务就能够细分为多个部分由多线程来处理,这么能够增强整个程序吞吐量,加紧反应时间。比如:浏览器程序就是一个多线程例子,

当下载一个应用程序或图片时,能够同时进行其它任务,比如播放动画或声音应用程序、打印一些内容、进行排序或者其它工作。聊天室(多人同时聊天)

在现实生活中,很多过程都含有多条线索同时动作特征,比如,我们能够一边走路,一边接电话,两件事并行。假如不允许这么做,我们会感觉极难受。第6页单线程程序多线程程序一个线程两个线程多线程多线程和传统单线程在程序设计上最大区分在于,因为各个线程控制流彼此独立,使得各个线程之间代码是乱序执行。第7页程序、进程、线程

多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第8页多任务、多进程、多线程多线程和多任务是两个现有联络又有区分概念:多任务是针对操作系统而言,代表着操作系统能够同时运行多个应用程序(多进程),比如我们能够利用计算机边听音乐,边浏览网页,或者从网络上下载东西,等等。以前古老DOS操作系统(V6.22)是单任务,还没有线程概念,系统在每次只能做一件事情。比如你在copy东西时候不能rename文件名。为了提升系统利用效率,采取批处理来批量执行任务。现在操作系统都是多任务操作系统,每个运行任务就是操作系统所做一件事情,比如你在听歌同时还在用MSN和挚友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行。一个任务普通对应一个进程,也可能包含好几个进程。比如运行MSN就对应一个MSN进程,假如你用是windows系统,你就能够在任务管理器中看到操作系统正在运行进程信息。第9页多任务、多进程、多线程多线程是针对一个程序而言,代表着一个程序内部能够同时执行线程个数,而每个线程能够完成不一样任务。普通来说,当运行一个应用程序时候,就开启了一个进程,当然有些会开启多个进程。开启进程时候,操作系统会为进程分配资源,其中最主要资源是内存空间,因为程序是在内存中运行。在进程中,有些程序流程块是能够乱序执行,而且这个代码块能够同时被屡次执行。实际上,这么代码块就是线程体。线程是进程中乱序执行代码流程。当多个线程同时运行时候,这么执行模式成为并发执行。多线程目标是为了最大程度利用CPU资源。第10页多任务、多进程、多线程对于一个进程中多个线程来说,多个线程共享进程内存块,当有新线程产生时候,操作系统不分配新内存,而是让新线程共享原有进程块内存。所以,线程间通信很轻易,速度也很快。不一样进程因为处于不一样内存块,所以进程之间通信相对困难。实际上,操作系统多进程实现了多任务并发执行,程序多线程实现了进程并发执行。多任务、多进程、多线程前提都是要求操作系统提供多任务、多进程、多线程支持。第11页多任务、多进程、多线程归纳起来,操作系统能够同时执行多个任务,每个任务就是进程,进程能够同时执行多个任务,每个任务就是线程。第12页程序、进程、线程多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第13页Java对多线程支持很多程序语言都是利用外部线程软件包来实现多线程。如C语言。Java是第一个支持内置线程操作主流编程语言。Java语言一大特征就是内置对多线程支持。多线程指同时存在几个执行体,按几条不一样执行线索共同工作情况,它使得编程人员能够很方便地开发出含有多线程功效、能同时处理多个任务功效强大应用程序。即使执行线程给人一个几个事件同时发生感觉,但这只是一个错觉,因为我计算机在任何给定时刻只能执行那些线程中一个,为了建立这些线程正在同时执行感觉,java快速地把控制从一个线程切换到另外一个线程多个线程执行是并发,也是一个逻辑上“同时”,而不是物理上“同时”。假如系统只有一个CPU,那么真正“同时”是不可能,不过因为CPU速度非常快,用户感觉不到其中区分,我们也没必要去关心它,只需要构想各个线程是同时执行即可。假如系统有多个CPU,能够实现真正“同时”执行。在应用程序中使用多线程不会增加CPU数据处理能力。第14页Java根本程普通常见Java应用程序都是单线程。比如,用java命令运行一个最简单HelloWorldJava应用程序时,就开启了一个JVM进程,JVM找到程序程序入口点main(),然后运行main()方法,这么就产生了一个线程,这个线程称之为“根本程”。当JVM加载代码,发觉main方法之后,就会开启一个线程,这个线程称作“根本程”,该线程负责执行main方法。假如main中没有创建其它线程,那么当main方法执行完最终一条语句,JVM就会结束我们java应用程序。假如main中又创建了其它线程,那么JVM就要在根本程和其它线程之间轮番切换,确保每个线程都有机会使用CPU资源,main方法即使执行完最终语句,JVM也不会结束我们程序,JVM一直等到程序中全部线程都结束之后,才结束我们java应用程序第15页Java根本程第16页多线程优点使用多线程进行程序设计含有以下优点:

1)多线程编程简单,效率高(能直接共享数据和资源,多进程不能)

2)适合于开发服务程序(如Web服务,聊天服务等)

3)适合于开发有各种交互接口程序(如聊天程序客户端,网络下载工具)

4)减轻编写交互频繁、包括面多程序困难(如监听网络端口)

5)程序吞吐量会得到改进(同时监听各种设备,如网络端口、串口、并口以及其它外设)

6)有多个处理器系统,能够并发运行不一样线程(不然,任何时刻只有一个线程在运行)第17页程序、进程、线程多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第18页Java中创建线程方法Java虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程扩展点,并给出了功效强大线程控制API。Java线程是经过java软件包java.lang中定义Thread类来实现。Java中有两种方法创建线程:继承Thread类。

实现Runnable接口。不论使用哪种方法,都需要用到Java基础类库中Thread类及其方法。在Java语言中,线程也是一个对象,但并非任何对象都能够成为线程,只有实现Runnable接口或继承了Thread类对象才能成为线程。第19页

Thread类publicclassThreadextendsObjectimplementsRunnableThread类是一个详细类,即不是抽象类,该类封装了线程行为。要创建一个线程,程序员必须创建一个Thread类子类。Thread类提供了大量方法来方便控制各个线程。第20页Thread类结构方法(1)publicThread():创建一个系统线程类对象。线程默认名是Thread-n,n是从0开始递增整数。(2)publicThread(Stringname):在第一个结构方法基础上,为所创建线程对象指定一个字符串名称供以后使用。(3)publicThread(Runnabletarget):该结构方法包含了Runnable类型参数,它是实现Runnable接口类实例对象,基于该结构方法创建线程对象,将线程业务逻辑交由参数所传递Runnable对象去实现。target是实现了Runnable接口类target对象。线程默认名是Thread-n,n是从0开始递增整数。第21页Thread类结构方法(4)publicThread(Runnabletarget,Stringname):实现前两个结构方法功效。(5)publicThread(ThreadGroupgroup,Runnabletarget):生成一个指定线程组和目标对象线程。(6)publicThread(ThreadGroupgroup,Stringname):生成一个指定线程组和名字线程。利用结构方法创建新线程对象之后,这个对象中相关数据被初始化,从而进入线程生命周期第一个状态—新建状态。第22页Thread类主要组员方法

方法

功效CurrentThread()返回当前运行Thread对象

start()开启线程

run()由调度程序调用,当run()方法返回时,该线程停顿stop()使调用它线程马上停顿执行sleep(longn)使线程睡眠n毫秒,n毫秒后,线程能够再次运行suspend()使线程挂起,暂停运行NotRunnable

resume()恢复挂起线程,使处于可运行状态Runnable

yield()将CPU控制权主动移交到下一个可运行线程★第23页Thread类主要方法(续)setName(String)赋予线程一个名字

getName()取得由setName()方法设置线程名字字符串getPriority()返回线程优先级setPriority(int)设置线程优先级join()当前线程等候调用该方法线程结束后,再往下执行setDaemon(boolean)设置该线程是daemon线程还是用户线程,Daemon线程也称服务线程,通常编成无限循环,在后台连续运行。第24页Thread类主要方法(续)在上述方法中,start()方法与run()方法最为惯用,start()方法用于开启线程,run()方法为线程主体方法,能够依据需要重写run()方法。第25页Thread类主要方法(续)publicvoidstart()开启线程,使该线程开始执行。屡次开启一个线程是非法。尤其是当线程已经结束执行后,不能再重新开启。第26页Thread类主要方法(续)publicvoidrun():Thread子类应该重写该方法,内容为该线程应执行任务。第27页Thread类主要方法(续)

publicfinalvoidsetPriority(intnewPriority)线程执行是一个抢占方式,优先级高比优先级低要取得更多执行时间,假如想让一个线程比其它线程有更多时间运行,能够经过设置线程优先级处理。如一个线程创建后,能够经过调用setPriority()方法来设置其优先级。newPriority是一个1-10之间正整数,数值越大,优先级越高,系统有一些常数值:1.MAX_PRIORITY:最高优先级(值为10)2.MIN_PRIORITY:最低优先级(值为1)3.NORM_PRIORITY:默认优先级(值为5)线程创建时,继承了父线程优先级。父线程是指执行创建新线程对象语句线程,它可能是根本程,也可能是用户自己定义线程。普通情况下,根本程含有默认优先级。第28页Thread类主要方法(续)publicfinalintgetPriority()返回线程优先级。在线程创建之后,能够经过getPriority()方法得到线程优先级,也能够经过setPriority()方法改变线程优先级。第29页Thread类主要方法(续)publicfinalStringgetName()publicfinalvoidsetName(String

name)每个线程在创建时可认为其指定名称,如果未指定,则由系统进行指定。对于根本程名称是:main。对于其他线程,默认名称样式是:“Thread-数字”。可以使用Thread类getName()方法获得线程名,使用setName()方法设置线程名。不一样线程可以有相同名称,不能使用线程名来区分线程。第30页Thread类主要方法(续)publiclonggetId()

每个线程在创建时会被分配一个ID属性,能够使用Thread类getID()方法取得线程ID。Thread类并没有提供修改ID方法。该方法返回该线程标识符。线程ID是一个正long数,在创建该线程时生成。线程ID是唯一,并终生不变。线程终止时,该线程ID能够被重新使用。不一样线程不能有相同ID,系统是使用ID值来区分线程。第31页方法1:继承Thread类创建线程Java.lang包中Thread类,是一个专门用来创建线程类,该类中提供了线程所用到属性和方法,这个类已经具备了创建和运行线程全部必要架构,经过重写Thread类中run()方法,以实现用户所需要功效,实例化自定义Thread类,使用start()方法开启线程。第32页方法1:继承Thread类创建线程经过创建Thread类子类来实现多线程。步骤以下:1.设计Thread类子类,重写父类run()方法。classmyThreadextendsThread{publicvoidrun() {//添加你自己线程代码

}}第33页方法1:继承Thread类创建线程2.在main()方法里面实例化myThread类,并运行该对象start()方法。publicstaticvoidmain(Stringargs[]){ myThreadthread1=newmyThread(“线程1”);//为该线程命名

thread1.start();//使用start()方法开启线程。当JVM将CPU使用权切换给线程时,会自动执行run()方法。}注意:线程开启是需要一个创建它进程,比如上面开启线程代码能够写在一个main()方法里面,运行时实际上有两个线程,一个是根本程,一个是名为“线程1”线程,这两个线程同时运行。第34页【例1】继承Thread类创建线程///创建一个主运行类///在主运行方法中,创建两个线程,让其交替运行publicclassthreadtest1{publicstaticvoidmain(String[]args){computet1=newcompute();compute1t2=newcompute1();t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}}///创建compute线程类///在这个线程类中,经过循环语句输出1-10十个整型数据classcomputeextendsThread{

publicvoidrun(){for(inti=0;i<10;i++){System.out.println(this.getName()+":"+i);}}}///创建compute线程类///在这个线程类中,经过循环语句输出说明性语句classcompute1extendsThread{publicvoidrun(){for(inti=0;i<10;i++){System.out.println(this.getName()+":"+i);}}}在使用java语言编写多线程程序时,运行结果与操作系统亲密相关,即使在同一台机器上,屡次运行同一个程序,结果也可能不一样。实际上全部多线程代码执行次序都是不确定,每次执行结果都是随机。第35页【例2:(书例10-1)】继承Thread类创建线程//继承Tread类publicclassMyThreadextendsThread{//count变量用于统计打印次数并共享变量

privatestaticintcount=0; publicMyThread(Stringname){ super(name); } publicstaticvoidmain(String[]args){//main方法开始

MyThreadp=newMyThread("t1");//创建一个线程实例

p.start();//执行线程

for(inti=0;i<5;i++){//根本程main方法执行一个循环 count++; System.out.println(count+":main");//根本程中打印count+“main”变量值,并换行 } } publicvoidrun(){//线程类必须有run()方法

for(inti=0;i<5;i++){ count++; System.out.println(count+":"+this.getName()); } }}第36页【例3】继承Thread类创建线程classSimpleThreadextendsThread{ privateStringname; publicSimpleThread(Stringname){ =name; } publicvoidrun(){//线程要执行逻辑操作

for(inti=0;i<10;i++){System.out.print();try{ sleep(1000);//睡眠1秒钟,方便观察线程执行结果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}}publicclassThreadDemo1{ publicstaticvoidmain(String[]args){ SimpleThreadthread1=newSimpleThread("张");//创建线程对象实例

SimpleThreadthread2=newSimpleThread("李"); SimpleThreadthread3=newSimpleThread("王"); thread1.start();//开启线程

thread2.start();//开启线程

thread3.start();//开启线程

}}第37页方法1:继承Thread类创建线程当线程类继承Thread类时,直接使用this即可获取当前线程。运行多线程程序时不要忘了java程序运行时默认根本程,main()方法方法体就是根本程线程执行体。使用继承Thread类方法来创建线程类时,多个线程之间无法共享线程类实例变量。第38页方法2:实现Runnable接口创建线程因为java语言仅支持单重继承,所以当定义线程需要继承多个类时用上述方法就无法实现,这时,就需要采取java提供另外一个定义线程方法----实现Runnable接口。它是在结构线程过程中可能出现多重继承问题一个处理方案。实现Runnable接口类就能够成为线程,Thread类就是因为实现了Runnable接口所以才含有了线程功效Runnable接口位于java.lang包中,这个接口非常简单,仅定义了一个run()方法,接口定义以下:publicinterfaceRunnable{publicabstractvoidrun();}第39页方法2:实现Runnable接口创建线程该接口只定义了一个方法run(),所以必须在新类中实现它。不过Runnable接口并没有任何对线程支持,我们还必须创建Thread类实例,这一点经过Thread类结构方法

publicThread(Runnabletarget);

来实现。

第40页方法2:实现Runnable接口创建线程在java中,线程是一个对象,不是全部对象都能够称为线程,只有实现了Runnable接口类才能够称为线程。实现Runnable接口创建新线程步骤以下:1.新建一个类,该类实现了Runnable接口并重写run()方法。重写run()方法中包含要在新线程中运行代码。classMyRunnableimplementsRunnable{publicvoidrun(){//把你任务代码写在这里}}第41页方法2:实现Runnable接口创建线程2.在main()方法中使用刚才新编写类创建Runnable接口类型对象。MyRunnabler=newMyRunnable();3.在main()方法中创建一个Thread类对象t,结构方法参数就是第2步创建MyRunnable类对象r,如:Threadt=newThread(r);第42页方法2:实现Runnable接口创建线程4.为线程命名,如:t.setName(“我线程”);//可选5.调用Thread类start()方法来运行新线程。如:t.strat();经过这种方法开启一个名为“我线程”线程,该线程执行MyRunnable类run方法中代码。第43页【例1】实现Runnable接口创建线程//创建两个线程,让其交替运行publicclassthreadtest{publicstaticvoidmain(String[]args){computec=newcompute();compute1c1=newcompute1();Threadt=newThread(c);Threadt1=newThread(c1);t.start();t1.start();}}//这是一个线程类//这个类主要是用来经过循环语句输出数字classcomputeimplementsRunnable{publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i);}}}//这是一个线程类//这个类主要是用来经过循环语句输出字符串语句classcompute1implementsRunnable{publicvoidrun(){for(inti=0;i<10;i++){System.out.println("这个数字是:"+i);}}}这个程序中,创建了2个线程,不过读者屡次运行程序后结果会不一样。为何呢?因为在程序中存在一个执行问题,在java中,线程是抢占式地执行,不需要时间片分配。第44页【例2:(书例10-2)】实现Runnable接口创建线程publicclassMyThread2implementsRunnable{ intcount=1,number; publicMyThread2(inti) { number=i; System.out.println("创建线程"+number); } publicvoidrun() { while(true){ System.out.println("线程"+number+":计数"+count); if(++count==6){ return; } } } publicstaticvoidmain(Stringargs[]) { for(inti=0;i<5;i++) newThread(newMyThread2(i+1)).start(); }}第45页【例3】实现Runnable接口创建线程classSimpleRunnableClassimplementsRunnable{ privateStringname; publicSimpleRunnableClass(Stringname){ =name; } publicvoidrun(){//线程要执行逻辑操作

for(inti=0;i<10;i++){System.out.print();try{ Thread.sleep(1000);//睡眠1秒钟,方便观察线程执行结果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}}publicclassThreadDemo2{ publicstaticvoidmain(String[]args){ SimpleRunnableClassr1=newSimpleRunnableClass("张");//创建对象实例

SimpleRunnableClassr2=newSimpleRunnableClass("李"); SimpleRunnableClassr3=newSimpleRunnableClass("王"); Threadthread1=newThread(r1);//创建线程对象实例

Threadthread2=newThread(r2); Threadthread3=newThread(r3); thread1.start();//开启线程

thread2.start();//开启线程

thread3.start();//开启线程

}}第46页两种创建线程方法比较通常推荐使用实现Runnable接口创建线程方法,理由以下:Java仅支持单重继承,一旦一个类继承了其它类,则不能继承Thread类。编写简单程序时,能够考虑使用继承Thread类,因为创建大量Thread类对象,开销较大。第47页方法3:经过匿名类创建线程有时候为了方便,能够直接经过匿名类方式创建线程,步骤以下:1.在根本程(main()方法)中,使用一个实现Runnable接口匿名派生类对象为参数,创建一个Thread对象,比如:

Threadthread1=newThread(newRunnable(){

publicvoidrun(){//线程要执行逻辑操作

}});2.调用步骤1中创建Thread对象start()方法,以开启新线程,比如:thread1.start();第48页例:经过匿名类创建线程publicclassThreadDemo3{publicstaticvoidmain(String[]args){ Threadthread1=newThread(newRunnable(){//创建线程对象实例(使用匿名对象)

publicvoidrun(){ for(inti=0;i<10;i++){ System.out.print(""+(int)(Math.random()*10));//打印随机数

try{ Thread.sleep(1000);//睡眠1秒,方便观察线程执行结果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}});thread1.start();//开启线程}}第49页程序、进程、线程多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第50页线程休眠过程在Java中,休眠指是这么一个情况:线程在运行过程中出于某种需要而“暂停”了,既不释放已经占用资源,也不会去占用处理机,但并没有消亡,这么线程需要某种条件或者一段时间才能够接着重新占用处理机运行。线程休眠使用Thread类sleep()方法。publicstaticvoidsleep(long

millis)throwsInterruptedException

在指定毫秒数内让当前正在执行线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性影响。该线程不丢失任何监视器所属权。参数:millis-以毫秒为单位休眠时间。抛出:InterruptedException-假如任何线程中止了当前线程。当抛出该异常时,当前线程中止状态被去除。第51页线程休眠过程假如需要线程运行过程中暂时休眠一段时间,能够采取以下方法:在该线程run方法中添加:try {…//其它代码

Thread.sleep(休眠时间,以毫秒为单位); …//其它代码

}catch(InterruptedExceptione) { e.printStackTrace(); }课件中代码:thread3.java和thread4.java第52页程序、进程、线程多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第53页线程生命周期Java线程生命周期:线程从产生到消亡过程。一个线程在任何一个时刻都处于某种线程状态。Java线程生命周期中一共有五个状态:①新建状态②就绪状态③运行(执行)状态④阻塞状态⑤终止状态(消亡)。下列图是五个状态状态转换示意图:

新建状态newThread(…)start()就绪状态运行状态CPU调度yield()消亡run()结束stop()阻塞状态I/Osleep()I/O完成sleep()时间到第54页线程生命周期新建状态:新建状态即创建一个新线程对象(newThread)。当一个线程处于新建状态时,系统不为它分配CPU时间片等资源,没有真正执行它。新建线程代码示例:

就绪状态:处于新建状态线程被开启后,将进入线程队列排队等候CPU时间片,此时它已经具备了运行条件。一旦轮到它来享用CPU资源时,就能够脱离创建它根本程独立开始自己生命周期了。另外原来处于阻塞状态线程被解除阻塞后也将进入就绪状态。就绪状态代码示例:

ThreadmyThread=newThread();myThread.start();3132第55页线程生命周期运行状态处于就绪状态线程被调度并取得CUP处理后进入了运行状态,每一个Thread类及其子类对象都有一个run()方法,当线程对象被调度执行时候,它将自动调用本对象run()方法,即正在运行线程执行是run方法中代码。注意:对线程操作应该写到run()方法中。33第56页线程生命周期阻塞状态:一个正在执行线程在一些特殊情况下,如被人为挂起或需要执行费时输入输出操作时,将让出CPU并暂时中止自己执行,进入阻塞状态。阻塞时它不能进入排队队列。只有当引发阻塞原因被消除时,线程才能够转入就绪状态,重新进到线程队列中排队等候CPU资源,方便从原来终止处开始继续运行。当下面情况发生时,线程就进入阻塞状态:(1)调用了sleep()方法;(2)调用了suspend()方法;(3)为等候一个条件变量,线程调用wait()方法;(4)输入/输出(I/O)流中发生线程阻塞。当发生以下情况之一时,线程从阻塞状态回到就绪状态:进入睡眠状态线程睡眠时间到线程等候I/O操作已经完成线程正在等候被另一个线程占用“锁”,该锁已经被释放34第57页线程生命周期终止状态当run()方法执行完成后,线程自动消亡终止,当Thread类调用start()方法时,Java虚拟机自动调用它run()方法,而当run()方法结束时,该Thread会自动终止。以前Thread类中存在一个停顿线程stop()方法,不过它现在被废弃了,因为调用这个方法,很轻易使程序进入不稳定状态。35第58页程序、进程、线程多任务、多进程、多线程

Java对多线程支持、Java根本程Java中创建线程方法线程休眠过程线程生命周期线程调度和优先级内容提要

第59页线程调度和优先级即使说线程是并发运行,然而事实经常并非如此。当系统中只有一个CPU时,多个线程需要共享CPU,在任何时间点上实际只能有一个线程在运行。控制多个线程在同一个CPU上以某种次序运行称为线程调度。Java采取是一个简单、固定调度法,即固定优先级调度(抢先式调度)。这种算法是依据处于可运行状态线程相对优先级来实施调度。当线程产生时,它继承原线程优先级,在需要时可对优先级进行修改。在任何时刻,假如有多条线程等候运行,则系统选择优先级最高可运行线程来运行。只有当它停顿、自动放弃或因为某种原因成为非运行态时,低优先级线程才能运行。假如两个线程含有相同优先级,它们将被交替运行。Java实时系统线程调度算法还是强制性,在任何时刻,假如一个比其它线程优先级都高线程状态变为可运行状态,则实时系统将选择该线程进行运行。第60页线程调度和优先级线程执行是一个抢占方式,优先级高比优先级低要取得更多执行时间,假如想让一个线程比其它线程有更多时间运行,能够经过设置线程优先级处理。如一个线程创建后,能够经过在线程中调用setPriority()方法来设置其优先级,详细方法以下:publicfinalvoidsetPriority(intnewPriority)newPriority是一个1-10之间正整数,数值越大,优先级越高,系统有一些常数值:1.MAX_PRIORITY:最高优先级(值为10)2.MIN_PRIORITY:最低优先级(值为1)3.NORM_PRIORITY:默认优先级(值为5)(一个线程对象被创建时默认优先级)线程创建时,继承了父线程优先级。父线程是指执行创建新线程对象语句线程,它可能是根本程,也可能是用户自己定义线程。普通情况下,根本程含有默认优先级。在线程创建之后,能够经过getPriority()方法得到线程优先级,也能够经过setPriority()方法改变线程优先级。第61页课件中代码:thread2.java线程优先级第62页线程优先级假如没有优先级要求,线程执行次序是随机,普通根

温馨提示

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

评论

0/150

提交评论