分类后的葵花宝典java基础day11线程_第1页
分类后的葵花宝典java基础day11线程_第2页
分类后的葵花宝典java基础day11线程_第3页
分类后的葵花宝典java基础day11线程_第4页
分类后的葵花宝典java基础day11线程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

图上的一键优化与清除同时在运行,在一个进程中同时在执行了多个任务。CPU开销。线程的使用会给系统带来上下文切换的额外负问题:先按照顺序运行完了然后接着再按照顺序运行完,我们想要的效果是runrun问题:先按照顺序运行完了然后接着再按照顺序运行完,我们想要的效果是run()JVN不会当作线程来运行,会认为是普通的方Thread类的对象并启动该线程,但是如果没有重写run(),什么也不线程池中,变得可运行,等待获取cpu的执行权。阻塞:CPU使用权,暂时停止运行。直到线程进入就绪Thread(Stringname) setName(Stringname) 默认线程的优先级是5setPriority(intnewPriority)设置线程的优先级 现取决于底层的操作系统的实现(最大的优先级是10,最小的1,默认是5 sleep(int classThreadDemo1extends{public}publicThreadDemo1(Stringnamesuper(name}publicvoidrun(){inti=0;while(i<30){System.out.println(this.getName()+""+":i="+i);System.out.println(Thread.currentThread().getName()+""+":i="+System.out.println(Thread.currentThread()==this);System.out.println("getId()"+""+":id="+super.getId()System.out.println("getPriority()"+""+":Priority=+super.getPriority()}}}class{publicstaticvoidmain(String[]{ThreadDemo1th1newThreadDemo1("线程1");ThreadDemo1th2newThreadDemo1("线程th1.setName("th1"th2.setName("th2"设置线程优先级1~th1.setPriority(10th2.setPriority(7System.out.println("max:"+Thread.MAX_PRIORITY);System.out.println("min:"+Thread.MIN_PRIORITY);System.out.println("nor:"+Thread.NORM_PRIORITY); o}}都了属于自己的tickets属性,那么就总共存在了四份。解决方案一:tickets使用staitc修饰,使每个线程对象都是共份属性Runnablerun方法packagepackagepublicclassDemo1publicstaticvoidmain(String[]args){MyRunmy=newMyRun();Threadt1=newThread(my);for(inti=0;i<200;i++){System.out.println("main:"+i);}}}classMyRunimplementsRunnablepublicvoidrun()for(inti=0;i<200;i++){System.err.println("MyRun:"+i);}}}执行的代码.RunnableThread的构造时,实际上就是让给Threadrun方法,Thread一项任务.Thread.slee(100classclassMyTicketimplementsRunnableinttickets=publicvoidrun()while(true)if(tickets>0)try}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()tickets号票");}else}}}}publicclassDemo6publicstaticvoidmain(String[]args){MyTicketmt=newMyTicket();Threadt1=newThread(mt);Threadt2=newThread(mt);Threadt3=newThread(mt);Threadt4=newThread(mt);}}每个java对象都有一个锁对象.而且只有一把类名对象(52T1L1T2L2T1L2T2publicclassDeadLockpublicstaticvoidmain(String[]args)newThread(newRunnable(创建线程publicvoidrun()synchronized("刀叉"){ 你不给我筷子我就不给你刀叉try}catch(InterruptedExceptione){}synchronized("筷子.getName(给你刀叉}}}}, newThread(newRunnable( publicvoidrun()synchronized("筷子"){ 你先给我刀叉我再给你筷子try}catch(InterruptedExceptione){}synchronized("刀叉.getName()+":好吧,把筷子给你}}} 人}}whilenotifyAll唤醒,notify容易出现只唤醒本方线程情况,导致程序中的所有线程都在等待。,publicpublicclassDemo10publicstaticvoidmain(String[]args){p=new Producerpro=newProducer(p);Consumercon=newConsumer(p);Threadt1newThread(pro生产者");Threadt2newThread(con消费者");}} {StringString}classProducerimplementsRunnable{publicProducer()}publicthis.p=}p)publicvoidrun(){inti=0;while(true){if(i%2==publicvoidrun(){inti=0;while(true){if(i%2==0)="jack";p.gender="man";}= p.gender女}}}classConsumerimplementsRunnable{publicConsumer()}publicthis.p=}p)publicvoidrun()while(true)System.out.println("name:"++"---gnder:"}}}Producer和Consumer对象所以Producer和Consumer的是同一个 显然屏幕输出了man这样的结果是出现了线程安全问题。所以需要使用packagepackagepublicclassDemo10publicstaticvoidmain(String[]args){p=new Producerpro=newProducer(p);Consumercon=newConsumer(p);Threadt1newThread(pro生产者");Threadt2newThread(con消费者");}} {StringString}classProducerimplementsRunnable{publicProducer()}public p)this.p=}publicvoidrun(){inti=0;while(true){synchronized(p)if(i%2==0)="jack";p.gender="man";}= p.gender女}}}}classConsumerimplementsRunnable{publicConsumer()}public p)this.p=}publicvoidrun()while(true)synchronized(p)System.out.println("name:"++"---gnder:"}}}}jack女或者manpublicpublicclassDemo10publicstaticvoidmain(String[]args){p=new Producerpro=newProducer(p);Consumercon=newConsumer(p);Threadt1newThread(pro生产者");Threadt2newThread(con消费者");}} {StringStringpublicsynchronizedvoidset(Stringname,Stringgender)=this.gender=}publicsynchronizedvoidread(){System.out.println("name:"++"----gender:"+}}classProducerimplementsRunnable{publicProducer()}public p)this.p=}publicvoidrun(){inti=0;while(true){if(i%2==0)p.set("jack",}else 女}}}classConsumerimplementsRunnable{publicConsumer()}publicpublicthis.p=}p)publicvoidrun()while(true){}}}有获得执行权,并持有了相同的监视器(锁)并调用notify为止。notify:唤醒持有同一个监视器(锁)wait的第一个线程,例如,餐馆有空位置packagepackagepublicclassDemo10publicstaticvoidmain(String[]args){p=new Producerpro=newConsumercon=newThreadt1newThread(pro生产者");Threadt2newThread(con消费者");}}//使 Stringname;Stringgender;booleanflag=publicsynchronizedvoidset(Stringname,Stringgender)if(flag)try}catch(InterruptedExceptione)}}=name;this.gender=gender;flag=true;}publicsynchronizedvoidread()if(!flag)try}catch(InterruptedExceptione)}}System.out.println("name:"++"----gender:"flag=false;}}classProducerimplementsRunnable{publicProducer()}public p)this.p=}publicvoidrun(){inti=0;while(true){if(i%2==0)p.set("jack",}else 女}}}classConsumerimplementsRunnable{publicConsumer()}public p)this.p=}publicpublicvoidrun()while(true){}}}waitnotif(,Object类中waitsleep()2.正常终止当线程的run()执行完毕,线程注意:Stop方法已过时,就不能再使用这个方法。run方法结束,classclassStopThreadimplementsRunnable{publicbooleantag=true;publicvoidrun()inti=while(tag)"i:"+}}}publicclassDemo8publicstaticvoidmain(String[argsStopThreadst=newStopThread();Threadth=newThread(st,"线程1");for(inti=0;i<100;i++)if(i==50){System.out.println("maini:"+i);st.tag=false;}}}}3.线setDaemon(boolean必须在启动线程之前(start方法之前)setDaemon(true)方法,才可以把main()执行完毕,那么程序就会终止,JVM也就退出了。该案例:开启了一个qq检测升级的线程,通过while真循环进行不停检测,当计数100的时候,表示检测完毕,提示是否更新,线程同时结束。classQQUpdateimplementsRunnableinti=classQQUpdateimplementsRunnableinti=publicvoidrun()while(true)System.out.println(Thread.currentThread().getName()+try}catch(InterruptedExceptione)}if(i==10

温馨提示

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

评论

0/150

提交评论