JAVA程序员培训定制课程c13课件

PPT
  • 阅读 46 次
  • 下载 0 次
  • 页数 31 页
  • 大小 180.535 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
JAVA程序员培训定制课程c13课件
可在后台配置第一页与第二页中间广告代码
JAVA程序员培训定制课程c13课件
可在后台配置第二页与第三页中间广告代码
JAVA程序员培训定制课程c13课件
可在后台配置第三页与第四页中间广告代码
JAVA程序员培训定制课程c13课件
JAVA程序员培训定制课程c13课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 31
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】JAVA程序员培训定制课程c13课件.ppt,共(31)页,180.535 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-45155.html

以下为本文档部分文字说明:

第十三章线程2本章内容线程的概念模型线程的创建和启动线程的状态控制临界资源、对象锁和死锁线程的互斥和同步3什么是线程线程是一个程序内部的顺序控制流。线程和进程每个进程都有独立的代码和数据空间

(进程上下文),进程切换的开销大。线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个顺序流同时执行4线程的概念模型虚拟的CPU,由java.lang

.Thread类封装和虚拟CPU所执行的代码,传递给Thread类对象。CPU所处理的数据,传递给Thread类对象。代码数据虚拟CPUJava线程模型5线程体Java的线程是通过java.lang.Thread类来实现的。每个线程都是通过某

个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。6创建线程----通过实现Runnable接口publicclassTestThread1{publicstaticvoidmain(Stringargs[]){Runner1r=newRunn

er1();Threadt=newThread(r);t.start();}}classRunner1implementsRunnable{publicvoidrun(){for(inti=0;i<30;i++){System.out.println("No."+i);}}}7多线程

Java中引入线程机制的目的在于实现多线程可以使用同一个Runnable接口(的实现类)类型的实例构造多个线程多线程之间可以共享代码和数据举例Threadt1=newThread(r);Threadt2=newT

hread(r);8多线程举例publicclassTestThread2{publicstaticvoidmain(Stringargs[]){Runner2r=newRunner2();Threa

dt1=newThread(r);Threadt2=newThread(r);t1.start();t2.start();}}classRunner2implementsRunnable{publicvoidrun(){f

or(inti=0;i<30;i++){System.out.println("No."+i);}}}9多线程共享数据和代码classMyRunnerimplementsRunnable{……}classYourRunnerimplementsRunnable{……}MyRunne

rm=newMyRunner();YourRunnery1=newYourRunner();YourRunnery2=newYourRunner();Threadt1=newThread(m);Threadt2=newThread(y1);Threadt3=newThread(y2);Thre

adt4=newThread(y2);线程虚拟CPU代码数据t1Thread类对象t1Runner2类中的run方法Runner2类型对象rt2Thread类对象t2Runner2类中的run方法Runner2类型对象r10启动线程使用start()方法启动线程启动线程是使线程进入到可运行

(runnable)状态,并不一定立即开始执行该线程publicclassTestThread1{publicstaticvoidmain(Stringargs[]){Runner1r=newRunner1();Thread

t=newThread(r);t.start();}}11线程状态转换(ThreadScheduling)12线程状态转换举例publicclassTestThread3{publicstaticvoidmain(Stringargs[]){Runner3r=newRun

ner3();Threadt=newThread(r);t.start();}}classRunner3implementsRunnable{publicvoidrun(){for(inti=0;i<30;i++){if(i%10==0&

&i!=0){try{Thread.sleep(2000);}catch(InterruptedExceptione){}}System.out.println("No."+i);}}}13终止线程控制举例publicclassTestThread4{publicstaticvoidmain(

Stringargs[]){Runner4r=newRunner4();Threadt=newThread(r);t.start();for(inti=0;i<100000;i++){if(i%10000==0&i>0)System.out.println("inth

readmaini="+i);}System.out.println("Threadmainisover");r.shutDown();}}classRunner4implementsRunnable{private

booleanflag=true;publicvoidrun(){inti=0;while(flag==true){System.out.print(""+i++);}}publicvoidshutDown(){flag=fal

se;}}14线程控制基本方法方法功能isAlive()判断线程是否还“活”着,即线程是否还未终止。getPriority()获得线程的优先级数值setPriority()设置线程的优先级数值Thread.sleep()将当前线程睡眠指定毫秒数join()调用某线程的该方法,将当前线程与

该线程“合并”,即等待该线程结束,再恢复当前线程的运行。yield()让出CPU,当前线程进入就绪队列等待调度。wait()当前线程进入对象的waitpool。notify()/notifyAll()唤醒对象的waitpool中的一个/所有等待线程。15join方法用法举例publiccl

assTestThread5{publicstaticvoidmain(Stringargs[]){Runner5r=newRunner5();Threadt=newThread(r);t.start();try{t.jo

in();}catch(InterruptedExceptione){}for(inti=0;i<50;i++){System.out.println("主线程:"+i);}}}classRunner5im

plementsRunnable{publicvoidrun(){for(inti=0;i<50;i++)System.out.println("SubThread:"+i);}}16创建线程的第二种方式----继承Thre

ad类publicclassTestThread6{publicstaticvoidmain(Stringargs[]){Threadt=newRunner6();t.start();}}classRunner6extendsThread{

publicvoidrun(){for(inti=0;i<50;i++){System.out.println("SubThread:"+i);}}}17两种创建线程方法的比较使用Runnable接口可以将CPU,代码和数据分开,形成清晰的模型;还可以从其他类继承;保持程序风格的一致性

。直接继承Thread类不能再从其他类继承;编写简单,可以直接操纵线程,无需使用Thread.currentThread()。18Ex11.分析并运行M13-6页的例子,体会通过实现Runnable接口创建线程的过程;2.细化M13-

16页程序,体会并实现通过继承Thread类创建线程,并要求实现下述输出结果:连续输出26个大写字母A–Z;19线程的调度Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪

些线程来执行。setPriority(int)方法设置优先级多数线程的调度是抢先式的。时间片方式非时间片方式20下面几种情况下,当前线程会放弃CPU:线程调用了yield(),suspend()或sleep()方法主动放弃;由于当前线程进行I/O访问,外存读写,等待用户

输入等操作,导致线程阻塞;为等候一个条件变量,线程调用wait()方法;抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度。线程的调度21线程的优先级线程的优先级用数字来表示,范围从1到10,一个线程的缺

省优先级是5Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用下述线方法获得或设置线程对象的优先级intgetPr

iority();voidsetPriority(intnewPriority);22临界资源问题(1)classStack{intidx=0;char[]data=newchar[6];publicvoidpush(charc){data[idx]=c;idx++;}publiccharpo

p(){idx--;returndata[idx];}}两个线程A和B在同时操纵Stack类的同一个实例(堆栈),A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据。231.操作之前data=

|a|b|||||idx=22.A执行push中的第一个语句,将c推入堆栈;data=|a|b|c||||idx=23.A还未执行idx++语句,A的执行被B中断,B执行pop方法,返回b:data=|a|b|c||||idx=

14.A继续执行push的第二个语句:data=|a|b|c||||idx=2最后的结果相当于c没有入栈,产生这种问题的原因在于对共享数据访问的操作的不完整性。临界资源问题(2)24在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完

整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时

,表明该对象在任一时刻只能由一个线程访问。互斥锁25关键字Synchronized用法举例publicvoidpush(charc){synchronized(this){data[idx]=c;idx++;}}publiccharpop(){synchronized

(this){idx--;returndata[idx];}}26关键字Synchronizedsynchronized除了象上面放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。publicsynchronizedvoidpush(ch

arc){…}如果synchronized用在类声明中,则表明该类中的所有方法都是synchronized的。publicsynchronizedclassStack{…}27实现多线程的同步clas

sSyncStack{//支持多线程同步操作的堆栈的实现privateintindex=0;privatechar[]data=newchar[6];publicsynchronizedvoidpush(charc){while(in

dex==data.length){try{this.wait();}catch(InterruptedExceptione){}}this.notify();data[index]=c;index++;}publicsynchronizedcharpop(){while(index==0

){try{this.wait();}catch(InterruptedExceptione){}}this.notify();index--;returndata[index];}}28生产者-消费者问题(1)生产者:classProducerimplementsRunnable{Sync

Stackstack;publicProducer(SyncStacks){stack=s;}publicvoidrun(){for(inti=0;i<20;i++){charc=(char)(Math.random()*26+'A');stack.pu

sh(c);System.out.println("生产:"+c);try{Thread.sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}}}}29消费者:classConsumerim

plementsRunnable{SyncStackstack;publicConsumer(SyncStacks){stack=s;}publicvoidrun(){for(inti=0;i<20;i++){charc=stack.pop();System.out.println("消费:"

+c);try{Thread.sleep((int)(Math.random()*1000));}catch(InterruptedExceptione){}}}}生产者-消费者问题(2)30生产者-消费者问题(3)主程序:publicclassSyncTest{publicstatic

voidmain(Stringargs[]){SyncStackstack=newSyncStack();Runnablep=newProducer(stack);Runnablec=newConsumer(stack);Threadt1=newThre

ad(p);Threadt2=newThread(c);t1.start();t2.start();}}31Ex21.分析并运行本讲义中的生产者--消费者问题实现程序,体会共享数据的使用和线程同步的含义及其实现;其中堆栈类Syn

cStack的定义见M13-26页;

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?