Java语言编程技术

上传人:汽*** 文档编号:569929518 上传时间:2024-07-31 格式:PPT 页数:46 大小:716KB
返回 下载 相关 举报
Java语言编程技术_第1页
第1页 / 共46页
Java语言编程技术_第2页
第2页 / 共46页
Java语言编程技术_第3页
第3页 / 共46页
Java语言编程技术_第4页
第4页 / 共46页
Java语言编程技术_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《Java语言编程技术》由会员分享,可在线阅读,更多相关《Java语言编程技术(46页珍藏版)》请在金锄头文库上搜索。

1、Java 语言编程技术第8章多线程1主要内容n线程的概念nJava中建立线程的两种方法n线程的调度n线程的基本控制n线程的互斥与同步2基本概念之一:进程n进程是正在运行的一个程序n程序:静态对象进程:动态过程n操作系统为每个进程分配一段内存空间,包括:代码、数据以及堆栈等资源n多任务的操作系统(OS)中,进程切换对CPU资源消耗较大3基本概念之二:线程n线程是比进程更小一级的执行单元n一个线程是一个程序内部的顺序控制流。每个线程有它自己的入口和出口,以及一个顺序执行的序列,有自身的产生、存在和消亡的过程。n同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销

2、小。n线程不能独立存在,必须存在于进程中n线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程(lightweightprocess)。4基本概念之三:多线程n多进程:在操作系统中,能同时运行多个任务(程序)。n多线程:在同一应用程序中,有多个顺序流同时执行。单线程多线程进程传统进程多线程进程5文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段只有一个地方在执行只有一个地方在执行文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段同时有数个地方在执行同时有数个地方在执行传统的进程传统的进程多线程的任务多线程的任务6建立

3、线程的两种方法n实现Runnable接口n继承Thread类7线程的方法nrun方法:运行线程的主体,启动线程时,由java直接调用nstart方法:启动线程nstop方法:停止线程nsleep方法:暂停线程的执行,让其它线程得到机会nsuspend方法:暂停线程的执行nresume方法:要求被暂停得线程继续执行nisAlive方法:判断线程目前是否正在执行状态中njoin方法:等待线程执行完毕,被等待的那个线程不结束,当前线程就一直等待.nyield方法:将执行的权力交给其它线程,自己到队列的最后等待.8建立线程的两种方法(续)nRunnable接口:publicinterfaceRunna

4、blepublic void run();n每个线程都是通过特定对象的run()方法来完成其操作的。方法run()称为线程体(线程方法)。9建立线程的两种方法(续)nThread类publicclassThreadimplementsRunnablepublic void run() ;publicvoidstart();10方法之一:Thread类n例:SimpleThread.javapublicclassSimpleThreadextendsThreadpublicvoidrun()publicstaticvoidmain(Stringargs)for(inti=0;i5;i+)newS

5、impleThread().start();11方法之一:Thread类(续)n线程的作用改善对用户界面的响应n例:Counter1.java对比:Counter2.java12方法之一:Thread类(续)n类构造方法uThread();无参数uThread(Stringthreadname);指定线程实例名uThread(Runnabletarget)参数指定目标对象uThread(Runnabletarget,Stringname)13方法之二:Runnablen自定义类实现Runnable接口n使用Thread类的另一构造函数:uThread(Runnabletarget)uThrea

6、d(Runnabletarget,Stringname)n使用Thread的start()启动线程n例:Counter3.java14方法之二:Runnable(续)npublicclassCounter3extendsJAppletimplementsRunnableclassStartLimplementsActionListenerpublicvoidactionPerformed(ActionEvente)if(selfThread=null)selfThread=newThread(Counter3.this);selfThread.start();15方法之二:Runnable(续

7、)nclassThreadimplementsRunnable.privateRunnabletarget;publicThread(Runnabletarget).publicsynchronizednativevoidstart();publicvoidrun()if(target!=null)target.run();.this.target=target;16多线程运行n例Counter4.javas=newTickersize;for(inti=0;is.length;i+)si=newTicker();for(inti=0;is.length;i+)si.start();class

8、TickerextendsThread17Daemonthreadsn守护线程是为其它线程提供服务的线程n守护线程一般应该是一个独立的线程,它的run()方法是一个无限循环.n守护线程与其它线程的区别是,如果守护线程是唯一运行着的线程,程序会自动退出n守护线程的设置方法uisDaemon()usetDaemon()需在start()前调用n例:Daemons.java18n在客户/服务器模式下,服务器的作用是等待用户发来请求,并按请求完成客户的工作客户端服务器端requestdaemon19多线程间的资源共享n多个线程在同时使用同一个资源可能产生冲突线程线程1线程线程2线程线程10资源资源取过

9、来取过来加加1后送回去后送回去withdrwal()withdrwal()透支透支余额余额变量变量20n例Sharing1.javau对共享数据访问的操作的不完整性inTwoCounter:publicvoidrun()while(true)t1.setText(Integer.toString(count1+);t2.setText(Integer.toString(count2+);.21多线程间的资源共享inWatcher:publicvoidrun()while(true)for(inti=0;is.length;i+)si.synchTest();inTwoCounter:publi

10、cvoidsynchTest()Sharing1.incrementAccess();if(count1!=count2)l.setText(Unsynched);22多线程间的资源共享inTwoCounter:publicvoidrun()while(true)count1+;count2+;.inWatcher相当于:publicvoidrun()while(true)if(count1!=count2)l.setText(Unsynched);23nsynchronized关键字保证共享数据操作的完整性u修饰方法publicsynchronizedvoidrun()publicsynch

11、ronizedvoidsynchTest()u修饰objectsynchronized(syncObject)n每个包含“synchronized”的对象使用一把“互斥锁”钥匙(使用权)多线程间的资源共享24n用synchronized来标识的区域或方法即为监视器监视的部分。n一个类或一个对象由一个监视器,如果一个程序内有两个方法使用synchronized标志,则他们在一个监视器管理之下.n一般情况下,只在方法的层次上使用关键区readwrite监监视视器器线程线程1线程线程225n例:Sharing2.java多线程间的资源共享classTwoCounterextendsThread.pu

12、blicsynchronizedvoidrun()while(true)count1+;count2+;publicsynchronizedvoidsynchTest()if(count1!=count2)l.setText(Unsynched);inWatcher:publicvoidrun()while(true).si.synchTest();TwoCounters;26多线程间的资源共享n可将TwoCounter的run()改为:publicvoidrun()while(true)synchronized(this)t1.setText(Integer.toString(count1+

13、);t2.setText(Integer.toString(count2+);修饰对象27nsynchronized修饰static方法synchronizedstaticvoidcall(Strings)该类所有对象共用一把“互斥锁”n例:Syned.java多线程间的资源共享28线程的生命周期new Thread()New ThreadRunnablestart()Not Runnablestop()stop()Deadyield()stop() orrun()exit. .suspend()sleep()wait()resume().29线程的结束n当一个线程执行完所有语句后就自动终止,

14、调用线程的stop()方法,也可以强制终止线程。n如果希望线程正常终止,可采用标记来使线程中的run()方法退出。30Becomingblockedn等待I/O操作n调用sleep(milliseconds)n调用suspend()n调用wait()n等待使用synchronizedmethod31Becomingblockednsleep(milliseconds)不释放互斥锁nsuspend()不释放互斥锁ususpend()resume()nwait()释放互斥锁uwait()notify()或notifyAll()uObject类的方法u例:生产者/消费者问题Consumer.java

15、32Becomingblocked进队出队生产者消费者33importjava.util.Vector;classProducerextendsThreadstaticfinalintMAXQUEUE=5;privateVectormessages=newVector();publicvoidrun()trywhile(true)putMessage();sleep(1000);catch(InterruptedExceptione)34privatesynchronizedvoidputMessage()throwsInterruptedExceptionwhile(messages.siz

16、e()=MAXQUEUE)wait();messages.addElement(newjava.util.Date().toString();notify();publicsynchronizedStringgetMessage()throwsInterruptedExceptionwhile(messages.size()=0)wait();Stringmessage=(String)messages.firstElement();messages.removeElement(message);notify();returnmessage;35classConsumerextendsThre

17、adProducerproducer;Consumer(Producerp)producer=p;publicvoidrun()trywhile(true)Stringmessage=producer.getMessage();System.out.println(Gotmessage:+message);sleep(2000);catch(InterruptedExceptione)36publicstaticvoidmain(Stringargs)Producerproducer=newProducer();producer.start();newConsumer(producer).st

18、art();37死锁n不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁n如果你持有一个锁并试图获取另一个锁时,就有死锁的危险.线程线程2pen线程线程1note把把“pen”给我给我,我我才能给你才能给你“note”把把“note”给我给我,我我才能给你才能给你“pen”38例DeadLock.javaclassclassApublicclassBb;synchronizedvoidmethoda()Stringname=Thread.currentThread().getName();tryThread.sleep(1000);catch(I

19、nterruptedExceptione)b.methodb();synchronizedvoidmethodb()(insideclassA.mothedb();39classclassBpublicclassAa;synchronizedvoidmethoda()Stringname=Thread.currentThread().getName();tryThread.sleep(1000);catch(InterruptedExceptione)a.methodb();synchronizedvoidmethodb()(insideclassB.mothedb();40classDead

20、LockimplementsRunnableclassAa=newclassA();classBb=newclassB();DeadLock()a.b=b;b.a=a;newThread(this).start();a.methoda();publicvoidrun()b.methoda();publicstaticvoidmain(Stringargs)newDeadLock();41classAclassB b;synchronized methoda() b.methodb();synchronized methodb()classBclassA a;synchronized metho

21、da() a.methodb();synchronized methodb()classA a = new classA();classB b = new classB();a.b = b; b.a = a;main线程a.methoda();b.methoda();子线程拥有a的使用权,等待b的使用权拥有b的使用权,等待a的使用权42线程的优先级n线程的优先级用数字来表示,范围从1到10nThread类中声明了三个常量:uThread.MIN_PRIORITYuThread.NORM_PRIORITYuThread.MAX_PRIORITYn一个线程的缺省优先级是5,即Thread.NORM

22、_PRIORITY43线程的优先级n线程调度器,按照线程的优先级决定应调度哪些线程来执行。uintgetPriority();uvoidsetPriority(intnewPriority);u线程创建时继承父线程的优先级uyield()n例:Counter5.java44Threadgroupsn每个线程都属于某个线程组uThread(ThreadGroupgroup,Runnabletarget,Stringname)uThread(ThreadGroupgroup,Stringname)nThread:uThreadGroupgetThreadGroup()nThreadGroup:uThreadGroupgetParent()usetMaxPriority(intpri)n例:ThreadGroup1.java45Threadgroups46

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号