版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
知识 要一 多线程介多线程的基本概程进立运行的程序空间。如正在运行的写字板程序就是一个进程。3部分组成:cpu、data、code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西,这样的缺点是:浪费内存,cpu的负担较重。多任务(Multitasking)操作系统将CPU时间动态地划分给每个进程,操作系独占CPU的使用权。WindowsCtrl+Alt+Del,线进程(lightweightprocess)。线程和进程的区进程要比线程消耗的计算机资源什么是并并发是指在一段时间内同时做多个事情。当有多个线程在运行时,CPU,这种情况下计算机操作系统会采用并发技术实现并发运行,具体做法是采用“时间片轮询算线程的执行特方法的执行特线程的执行特什么是主线程以及子线主线thread即main方法对应的线程,它是程序开始时就执行的。Javamain方法,是作为某个类的方法出现的。当程序启动时,该方法就会第一个自动的得到执行,并成为程序的主线程。也就是说,main方法是一个应用的也代表了这个应用的主线程JVM在执行main方法时,main方进入到栈内存,JVM会通过操作系统开辟一条main方法通向cpu的执行路径,cpu就可以通过这个路径来执行main方法,而这个路径有一个名字,叫main(主)线程子线在主线创建并启动的线程,一般称之为子线程二 线程的创Java通过继承Thread类实现多线Javajava.lang.Thread继承Thread类实现多线程的步骤:ThreadThreadrun(run(startpublicpublicclassTestThreadextendsThreadpublicTestThread(){}*publicvoidrun()for(inti=0;i<20;i++){System.out.println(this.getName()+""+i);}}publicstaticvoidmain(String[]args)TestThreadt1newTestThread();TestThreadt2=new}}通过实现Runnable接口实现多线publicpublicclassTestThread2implementsRunnablepublicTestThread2(){}*publicvoidrun()"开始for(inti=0;i<20;i++){}"结束结束}publicstaticvoidmain(String[argsTestThread2testThread2=newTestThread2();Threadt1=newThread(testThread2);Threadt2=newThread(newTestThread2());}}线程的执行流线程的生命周5new程有自己的内存空间,通过调用start方法进入就绪状态。就绪状态处于就绪状态的线程已经具备了运行条件,但是还没有被分配到CPU,处于“线程就绪队列”,等待系统为其分配CPU。就绪状态并不是执行状态,当系统选定一个等待执行自己的run方法。有4中原因会导致线程进入就绪状态:startyield(运行线程:JVMCPU运行状态在运行状态的线程执行自己run方法中的代码,直到调用其他方法而终止或等待某资阻塞状态执行wait(nofity()方法唤醒这个线程后,线程运行时,某个操作进入阻塞状态,比如执行IO流操作(read()/write()方法本join()线程联合:run(stop()或三 线程的使终止线如果我们想在一个线终止另一个线程我们一般不使用JDK提供的stop()/destroy()方法(它们本身也被JDK废弃了)。通常的做法是提供一个boolean型的终止变量,当这个变量值为false时,则终止线程的运行。publicpublicclassStopThreadimplementsRunnableprivatebooleanflag=true;publicvoidrun()"开始inti=System.out.println(Thread.currentThread().getName()+""+i++);try{}catch(InterruptedExceptione){}}"结束}publicvoidthis.flag=}publicstaticvoidmain(String[]args)throwsExceptionStopThreadstnewStopThread();Threadt1=newThread(st);}}暂停当前线程执行sleep()yield()yield()CPUsleep方法的使publicpublicclassSleepThreadimplementsRunnable{publicvoidrun()"开始for(intSystem.out.println(Thread.currentThread().getName()+""+i);try{}catch(InterruptedExceptione){}}"结束}publicstaticvoidmain(String[argsThreadt=newThread(newSleepThread());}}yield方法的使yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次yieldyieldyield后,yieldyieldpublicpublicclassYieldThreadimplementsRunnable{publicvoidrun()for(intif(i==0){}}}}publicstaticvoidmain(String[]args){Threadt1=newThread(newYieldThread());Threadt2=newThread(newYieldThread());}}线程的联ABjoin(BA这样,线程A就必须等待线程B执行完毕后,才能继续执行。join方法的使classAimplementspublicclassAimplementspublicvoidrun()for(inti=0;i<10;i++){try{}catch(InterruptedExceptione)}}}}classBimplementsRunnable{publicvoidrun()for(inti=0;i<20;i++){
try{}catch(InterruptedExceptione){}}}}publicclassJoinThreadpublicstaticvoidmain(String[]args){Threadt=newThread(newA());Threadt1=newThread(newB());for(inti=0;i<10;i++){
if(i==2try}catch(InterruptedExceptione){}}try{}catch(InterruptedExceptione){}}}}线程联合案*classSonThreadimplementspublicvoidrun(){for(inttry{}catch(InterruptedExceptione){}}}}*classFatherThreadimplementspublicvoidrun() 想抽烟,发现烟抽完了 让儿子去买一包红塔山Threadt=newThread(newSonThread());try{}catch(InterruptedExceptione){ }}}publicclassJoinDemopublicstaticvoidmain(String[]args)ThreadtnewThread(newFatherThread());}}Thread类中的其他常用方获取当前线程名方式this.getName()ThreadclassclassGetName1extendsThread{publicvoidrun(){}}方式Thread.currentThread().getName()Runnable接口实现classclassGetName2implementspublicvoidrun(){}}设置线程的名方式classclassSetName1extendspublicSetName1(String}publicvoidrun(){}}publicclassSetNameThreadpublicstaticvoidmain(String[]args){SetName1setName1=newSetName1("SetName1");}}方式setName()classclassSetName2implementspublicvoidrun(){}}publicclassSetNameThreadpublicstaticvoidmain(String[]args)/*SetName1setName1=newSetName1();Threadthread=newThread(newSetName2());}}判断当前线程是否存isAlive()classAliveclassAliveimplementspublicvoidrun(){try{}catch(InterruptedExceptione){}}}publicclassAliveThreadpublicstaticvoidmain(String[]args){Threadthread=newThread(newAlive());System.out.println(thread.isAlive()+"1");System.out.println(thread.isAlive()+"3");try{}catch(InterruptedExceptione){}}}四 线程的优先什么是线程的优先110,一个线程的缺省优先级是5。Java的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,线程优先级的使intvoidsetPriority(intclassclassPriorityimplementsprivateintnum=privatebooleanflag=true;publicvoidrun()}}publicvoidthis.flag=}}publicclassPriorityThreadpublicstaticvoidmain(String[]args)throwsException{Priorityp1=newPriority();Priorityp2=newPriority();Threadt1newThread(p1,"Threadt2newThread(p2,"//Thread.MAX_PRIORITY=//Thread.MAX_PRIORITY=1}}五 守护线什么是守护线JavaUserThread(用户线程)DaemonThread(守护线程):比如回收线程,就是最典型的守护线程守护线程(即DaemonThread),是一个服务线程,准确地来说就是服务其他的线程,守护线程会随着用户线程而守护线程与用户线程的区用户线程,不随着主线程的而。用户线程只有两种情况会死掉,1在run中异常终止。2正常把run执行完毕,线程。守护线程,随着用户线程的而,当用户线程守护线程也会随之守护线程的使*classDaemonimplementspublicvoidrun()for(inti=0;i<20;i++){try{}catch(InterruptedExceptione){}}}}classUsersThreadimplementsRunnable{publicpublicvoidrun()Threadt=newThread(newfor(inti=0;i<5;i++){try{}catch(InterruptedExceptione){}}}}publicclassDaemonThreadpublicstaticvoidmain(String[]args)throwsException{Threadt=newThread(newUsersThread(),"UsersThread");}}六 线程同什么是线程同线程现现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题。比如:教室这时候,我们就需要用到“线程同步”。线程同步其实就是一种等待机制,多个需要同时线程案例演我们以银行取款经典案例来演示线程现象用户输入账户、,系统判断用户的账户、是否匹配*class//privateString//privatedoublepublicAccount()}publicAccount(StringaccountNo,doublebalance)this.accountNo=this.balance=}publicStringgetAccountNo()return}publicvoidsetAccountNo(StringaccountNo)this.accountNo=}publicdoublegetBalance()return}publicvoidsetBalance(doublebalance)this.balance=}}*classDrawThreadextends//privateAccount//privatedoublepublicDrawThread(Stringname,Accountaccount,doublethis.account=account;this.drawMoney=}*publicvoidrun()//if(this.account.getBalance()>="try{}catch(InterruptedExceptione){}"}}}publicclassDrawMoneyThreadpublicstaticvoidmain(String[]args){Accountaccount=newAccount("1234",1000);newDrawThread("老公newDrawThread("老婆}}实现线程同的问题。Java语言提供了专门机制以解决这种,有效避免了同一个数据对象被多个线程同时造成的这种问题。这套机制就是synchronized关键字。}需要对哪些线的代码具有互斥能力(通过synchronized锁对象来决定)它包括两种用法:synchronized方法和synchronized块。synchronized方法通过在方法中加入synchronized关键字来,语法如下publicsynchronizedvoidaccessVal(intsynchronized在方法时使用:放在范围操作符(public)之后,返回类型(void)是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。synchronized方法的缺陷若将一个大的方法为synchronized将会大大影响效Java为我们提供了更好的解决办法,那就是synchronized块。块可以让我们精确修改线程案例演*class//privateString//privatedoublepublicAccount()}publicAccount(StringaccountNo,doublebalance)this.accountNo=this.balance=}publicStringgetAccountNo()return}publicvoidsetAccountNo(StringaccountNo)this.accountNo=}publicdoublegetBalance()return}publicvoidsetBalance(doublebalance)this.balance=}}*classDrawThreadextends//privateAccount//privatedoublepublicDrawThread(Stringname,Accountthis.account=account;this.drawMoney=}*publicvoidrun()synchronized(this.account)//if(this.account.getBalance()>=this.drawMoney)System.out.println(this.getName(钞票:try}catch(InterruptedExceptione){}//-System.out.println("\t余额为:}elseSystem.out.println(this.getName(不足}}}}publicclassDrawMoneyThreadpublicstaticvoidmain(String[]args){Accountaccount=newAccount("1234",1000);newnewDrawThread("老公newDrawThread("老婆}}线程同步的使使用this作为线程对象在不同线,相同对象中的synchronized会互斥。}或publicsynchronizedvoidaccessVal(int}*classprivateStringpublicProgrammer(S=}*synchronizedpublicvoidtrySystem.out.println(接通电源");System.out.println(按开机按键");System.out.println(系统启动中");System.out.println(系统启动成功}catch(InterruptedExceptione){}}*synchronizedpublicvoidtrySystem.out.println(Idea");System.out.println(Idea启动完毕");System.out.println(开开心心的写代码}catch(InterruptedExceptione){}}}*classWorking1extendsprivateProgrammerpublicWorking1(Programmerthis.p=}}publicvoidrun()}}*classWorking2extendsprivateProgrammerpublicWorking2(Programmerthis.p=}publicvoidrun()}}publicclassTestSyncThreadpublicstaticvoidmain(String[]args)Programmerp=newnewnew}}使用字符串作为线程对象synchronized时都会同步。}*classprivateStringpublicProgrammer(S=}*synchronizedpublicvoidtrySystem.out.println(接通电源");System.out.println(按开机按键");System.out.println(系统启动中");System.out.println(系统启动成功}catch(InterruptedExceptione){}}*synchronizedpublicvoidtrySystem.out.println(Idea");System.out.println(Idea启动完毕");System.out.println(开开心心的写代码}catch(InterruptedExceptione){}}*publicvoidsynchronized("suibian")trySystem.out.println(打开卫生间门");System.out.println(开始排泄");System.out.println(冲水");System.out.println(离开卫生间}catch(InterruptedExceptione){}}}}*classWorking1extendsprivateProgrammerpublicWorking1(Programmerthis.p=}publicvoidrun()}}*classWorking2extendsprivateProgrammerpublicWorking2(Programmerthis.p=}publicvoidrun()}}*classWCextendsThread{privateProgrammerp;publicWC(Programmerp){this.p=}publicvoidrun()}}publicclassTestSyncThreadpublicstaticvoidmain(String[]args)/*Programmerp=newProgrammer(" newWorking1(p).start();newProgrammerp=newProgrammer(" Programmerp1=new Programmerp2=new newnewnew}}}使用Class作为线程对象在不同线,拥有相同Class对象中的synchronized会互斥。}或synchronizedpublicstaticvoid*classprivateStringname;publicSale(Stringname){=}*synchronizedpublicstaticvoidtrySystem.out.println(Thread.currentThread().getName(表扬System.out.println(Thread.currentThread().getName(拿钱System.out.println(Thread.currentThread().getName(示感谢
System.out.println(Thread.currentThread().getName(的拿钱走人}catch(InterruptedExceptione){}}}classprivateStringpublicProgrammer(S=}*synchronizedpublicvoidtrySystem.out.println(接通电源");System.out.println(按开机按键");System.out.println(系统启动中");System.out.println(系统启动成功}catch(InterruptedExceptione){}}*synchronizedpublicvoidtrySystem.out.println(Idea");System.out.println(Idea启动完毕");System.out.println(开开心心的写代码}catch(InterruptedExceptione){}}*publicvoidsynchronized("suibian")trySystem.out.println(打开卫生间门");System.out.println(开始排泄");System.out.println(冲水");System.out.println(离开卫生间}catch(InterruptedExceptione){}}}*
publicvoidsynchronized(Programmer.class)trySystem.out.println(+"被 System.out.println(拿钱");System.out.println(对公司表示感谢");System.out.println(}catch(InterruptedExceptione){}}}}*classWorking1extendsprivateProgrammerpublicWorking1(Programmerthis.p=}publicvoidrun()}}*classWorking2extendsprivateProgrammerpublicWorking2(Programmerthis.p=}publicvoidrun()}}*classWCextendsThread{privateProgrammerp;publicWC(Programmerp){this.p=}publicvoidrun()}}*classProgrammerMoneyextendsprivateProgrammerpublicProgrammerMoney(Programmerthis.p=}publicvoidrun()}}*classSaleMoneyThreadextendsprivateSalepublicSaleMoneyThread(Salethis.p=}publicvoidrun()}}publicclassTestSyncThreadpublicstaticvoidmain(String[]args)/*Programmerp=newProgrammer(" newWorking1(p).start();new/*Programmerp=newProgrammer(" Programmerp1=newProgrammer(" Programmerp2=new newnewWC(p1).start();newWC(p2).start();*//*Programmerp=new Programmerp1=newProgrammer(" newProgrammerMoney(p).start();newSalesale=new Salesale1=newSale("张丽丽");newSaleMoneyThread(sale).start();newSaleMoneyThread(sale1).start();/*Programmerp1=newProgrammer(" newProgrammerMoney(p1).start();Salesale1newSale("张丽丽new}}}使用自定义对象作为线程对象在不同线,拥有相同自定义对象中的synchronized会互斥。}*classprivateStringname;publicSale(Stringname){=}*synchronizedpublicstaticvoidtrySystem.out.println(Thread.currentThread().getName(表扬System.out.println(Thread.currentThread().getName(拿钱System.out.println(Thread.currentThread().getName(示感谢
System.out.println(Thread.currentThread().getName(的拿钱走人}catch(InterruptedExceptione){}}}classprivateStringpublicProgrammer(S=}*synchronizedpublicvoidtrySystem.out.println(接通电源");System.out.println(按开机按键");System.out.println(系统启动中");System.out.println(系统启动成功}catch(InterruptedExceptione){}}*synchronizedpublicvoidtrySystem.out.println(Idea");System.out.println(Idea启动完毕");System.out.println(开开心心的写代码}catch(InterruptedExceptione){}}*publicvoidsynchronized("suibian")trySystem.out.println(打开卫生间门");System.out.println(开始排泄");System.out.println(冲水");System.out.println(离开卫生间}catch(InterruptedExceptione){}}}*publicvoidsynchronized(Programmer.class)try
System.out.println(+"被 System.out.println(拿钱");System.out.println(对公司表示感谢");System.out.println(}catch(InterruptedExceptione){}}}}classprivateStringpublicManager(S=}publicStringreturn
*publicvoidcheers(StringmName,StringtrySystem.out.println(mName来到eNameSystem.out.println(eName拿起酒杯");System.out.println(mName和eName}catch(InterruptedExceptione){}}}*classWorking1extendsprivateProgrammerpublicWorking1(Programmerthis.p=}publicvoidrun()}}*classWorking2extendsprivateProgrammerpublicWorking2(Programmerthis.p=}publicvoidrun()}}*classWCextendsThread{privateProgrammerp;publicWC(Programmerp){this.p=}publicvoidrun()}}*classProgrammerMoneyextendsprivateProgrammerpublicProgrammerMoney(Programmerthis.p=}publicvoidrun()}}*classSaleMoneyThreadextendsprivateSalepublicSaleMoneyThread(Salethis.p=}publicvoidrun()}}*classCheersThreadextendsThread{privateManagermanager;privateStringname;publicCheersThread(Stringname,M=this.manager=}publicvoidrun()synchronized(this.manager)}}}publicclassTestSyncThreadpublicstaticvoidmain(String[]args)/*Programmerp=newProgrammer(" newWorking1(p).start();new/*Programmerp=newProgrammer(" Programmerp1=newProgrammer(" Programmerp2=new newnewWC(p1).start();newWC(p2).start();*//*Programmerp=new Programmerp1=newProgrammer(" newProgrammerMoney(p).start();new/*Salesale=new Salesale1=newSale("张丽丽");newSaleMoneyThread(sale).start();new/*Programmerp1=newProgrammer(" newProgrammerMoney(p1).start();Salesale1newSale("张丽丽newManagermanagernew 丰newnewnew}}死锁的概因此,某一个同步块需要同时拥有“两个以上对象的锁”时,就可能会发生“死锁”死锁案例演class}class}classMakeupextendsprivateStringstaticLipsticklipstick=newstaticMirrormirror=newpublicvoidsetFlag(intflag)this.flag=}publicvoidsetGirlName(StringgirlName)this.girlName=}publicvoidrun()}*publicvoidif(flag==synchronized"try}catch(InterruptedExceptione){}synchronized"}}synchronized"try}catch(InterruptedExceptione){}synchronized"}}}}}publicclassDeadLockThreadpublicstaticvoidmain(String[]args){Makeupmakeup=newMakeup();Makeupmakeup1=newMakeup();}}死锁问题的解死锁是由于“同步块需要同时持有多个对象锁造成”class}class}classMakeupextendsprivateStringstaticLipsticklipstick=newstaticMirrormirror=newpublicvoidsetFlag(intflag)this.flag=}publicvoidsetGirlName(StringgirlName)this.girlName=}publicvoidrun()}*publicvoidif(flag==synchronized"try}catch(InterruptedExceptione){}}synchronized"}synchronized"try}catch(InterruptedExceptione){}}synchronized"}}}}publicclassDeadLockThreadpublicstaticvoidmain(String[]args){Makeup
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年可再生能源发电项目承包合同
- 2024年度保险合同:甲方投保乙方承保约定保险条款和保费2篇
- 2024商业贷款抵押反担保协议样本版B版
- 2024年度个人股权转让合同:股权转让双方的股东会决议及授权书
- 2024年室内保温墙面施工协议范例版B版
- 2024年度医药产品研发与许可使用合同2篇
- 2024年度技术开发合同:乙公司与丙法人共同研发新技术2篇
- 2024年国际航空运输合作合同版B版
- 2024年度品牌推广与市场策划服务代理合同2篇
- 2024年WTO框架下服务贸易标准协议版B版
- 人教版数学四年级上册-第五单元-平行四边形和梯形-单元测试卷(含答案)
- 国开(河北)2024年秋《现代产权法律制度专题》形考作业1-4答案
- 2024世界糖尿病日糖尿病与幸福感糖尿病健康教育课件
- 民用无人机操控员执照(CAAC)考试复习重点题库500题(含答案)
- 2024年全国中学生地理知识竞赛试题及答案
- 中外比较文学研究专题智慧树知到期末考试答案2024年
- (2024年)师德师风学习内容教师师德师风培训内容通用多篇
- EPC项目投标人承包人工程经济的合理性分析、评价
- Java程序设计入门(第2版)PPT全套完整版教学课件
- 国家开放大学行为表现答案
- 籍贯对照表完整版
评论
0/150
提交评论