




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java中很重要的一个知识点,在此还是有必要总结一下的。JavaJava中多线程各重要知识点。掌握了上图中的各知识点,Java中的新建状态(New):当线程对象对创建后,即进入了新建状态,如:ThreadtnewCPU调度执行,t.start()此线程立即就会执行;运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正 绪状态是进入到运行状态的唯一,也就是说,阻塞状态(Blocked):CPU的使用CPU调用--synchronized同步锁失败(因为锁被其它线程所占用),它会进--sleep()join()I/O请求时,线程会进入到阻塞状二JavaJava1classMyThreadextends1classMyThreadextendsThread2345678911privateinti=publicvoidrun()for(i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);}}1publicclassThreadTest234567publicstaticvoidmain(String[]args)for(inti=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);if(i==30){ThreadmyThread1=newThreadmyThread2=new8myThread29start()start()14}}}Threadrun()MyThread,其中时一个新的线程得以创建,并进入到线程新建状态。通过调用线程对象的start()方CPUThread对象才是真正的线程对象。11classMyRunnableimplementsRunnable2345678910privateinti=publicvoidrun()for(i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);}}1publicclassThreadTest234567publicstaticvoidmain(String[]args)for(inti=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);if(i==30){RunnablemyRunnablenewMyRunnable Threadthread1newThread(myRunnable);myRunnable为Threadtarget创建新的线程9Threadthread2=newthread1.startstart()方法使得线程进入就绪状态}}}}ThreadRunnable1publicclassThreadTest{ publicstaticvoidmain(String[]args)4(inti=0;i<100;i++)5System.out.println(Thread.currentThread().getName()+""+6if(i==30)7RunnablemyRunnable=new8Threadthread=new9}11publicinterfaceRunnable2345void13}}15classMyRunnableimplementsRunnable25privateinti=publicvoidrun()System.out.println("inMyRunnablerun");for(i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+}}27classMyThreadextendsThread42privateinti=publicMyThread(Runnable}publicvoidrun(){System.out.println("inMyThreadrun");for(i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+}}1Threadthread=newRunnable1Threadthread=newRunnablerun()Runnable接口中定义的方法。publicvoidrun()if(targetpublicvoidrun()if(target!=null){}}MyThreadrun()方法。CallableFutureCallable接口的实现类,并实现clall()FutureTaskCallableFutureTaskThreadtarget来创建线程。1publicclassThreadTest{ publicstaticvoidmain(String[]args){Callable<Integer>myCallablenew MyCallableFutureTask<Integer>ftnewFutureTask<Integer>(myCallable);FutureTaskMyCallable7 for(inti=0;i<100;i++)System.out.println(Thread.currentThread().getName()+""+if(i==30)Threadthreadnew tryintsum=ft.get(); System.out.println("sum="+}catch(InterruptedExceptione)}catch(ExecutionExceptione)28}}31classMyCallableimplementsCallable<Integer>45privateinti=publicIntegercall(){intsum=0;for(;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);sum+=i;}return}1publicclassFutureTask<V>implementsRunnableFuture<V>{ 451publicinterface1publicclassFutureTask<V>implementsRunnableFuture<V>{ 451publicinterfaceRunnableFuture<V>extendsRunnable,Future<V>{ void45targetFuturecall()方法的返回值。执行下此程序,我们发现sum=4950都是最后输出的。而“主线程for循环执行完毕..”CPU的线程调度机制,我们知道,“for循环执行完毕..”的输出时机是没有任何问题的,那么为什么sum=4950会最后输出毕,ft.get()方一直阻塞,直到call()方法执行完毕才能取到返回值。三.Java多线程的就绪、运行和状运行状态转换为状态:当此线程线程执行体执行完毕或发生了异常CPUA线程yield()CPUA线程的情况。1publicclass1publicclassThreadTest2345678918publicstaticvoidmain(String[]args)MyRunnablemyRunnable=newThreadthread=newfor(inti=0;i<100;i++){System.out.println(Thread.currentThread().getName()+""+i);if(i==30){}if(i==}}}20classMyRunnableimplementsRunnableprivatebooleanpublicvoidrun()for(inti=0;i<100&&!stop;i++){System.out.println(Thread.currentThread().getName()+""+i);}}publicvoidstopThread()this.stop=}}本文承接上一篇文章《Java总结篇系列:Java多线程(一)》。四.Java多线程的阻塞状态与线程控制JavaJava1publicclassThreadTest234567891publicclassThreadTest23456789publicstaticvoidmain(String[]args)MyRunnablemyRunnable=newThreadthread=newfor(inti=0;i<100;i++)System.out.println(Thread.currentThread().getName()+""+i);if(i==30){trymainthread}catch(InterruptedExceptione) }20}}22classMyRunnableimplementsRunnablepublicvoidrun()30for(inti=0;i<100;i++)System.out.println(Thread.currentThread().getName()+""+}}sleep——让当前的正在执行的线程暂停指定的时间,并进入阻塞状态。在其睡眠的时间sleep()sleep()方法常用来暂停线1publicclassThreadTest2341publicclassThreadTest2345678920publicstaticvoidmain(String[]args)MyRunnablemyRunnable=newThreadthread=newfor(inti=0;i<100;i++)System.out.println(Thread.currentThread().getName()+""+i);if(i==30){trythread}catch(InterruptedExceptione)}}}}22classMyRunnableimplementsRunnable publicvoidrun() for(inti=0;i<100;i++) System.out.println(Thread.currentThread().getName()+""+30}}CPU线程(Daemon线程”。如JVM中的回收线程。用...伟大啊!!)。1publicclassThreadTest23publicstaticvoid1publicclassThreadTest23publicstaticvoidmain(String[]args)4ThreadmyThread=new5for(inti=0;i<100;i++)6System.out.println("mainthreadi"+7if(i==20)89}}}}classMyThreadextendsThreadpublicvoidrun()for(inti=0;i<100;i++)System.out.println("i="+try}catch(InterruptedException{//TODOAuto-generated}} 29判断线程是否 注:main线程默认是前台线程,前台线程创建中创建的子线程默认是前台线程,线程中创建的线程默认是线程。调用setDeamon(true)方法将前台线程设置为线程时,需要在start()方法调用之前。前天线后,JVM通知线程,但从接收默认的优先级都与创建它的线程的优先级相同。main线程默认具有普通优先级。设置线程优先级:setPriority(intpriorityLevel)priorityLevel1-10之间,常用11publicclassThreadTest{publicstaticvoidmain(String[]args)ThreadmyThread=newfor(inti=0;i<100;i++)System.out.println("mainthreadi="+if(i==20) 1416classMyThreadextendsThread{ publicvoidrun() for(inti=0;i<100;i++) System.out.println("i="+ 231publicclassThreadTest2publicstatic1publicclassThreadTest2publicstaticvoidmain(String[]args)ThreadmyThread1=newThreadmyThread2=newfor(inti=0;i<100;i++)System.out.println("mainthreadi="+if(i==20) 1820classMyThread1extendsThread{27publicvoidrun()for(inti=0;i<100;i++){System.out.println("myThread1--}}i="+29classMyThread2extendsThread36publicvoidrun()for(inti=0;i<100;i++){System.out.println("myThread2--}}i="+11publicclassThreadTest2345678912publicstaticvoidmain(String[]args)Accountaccount=newAccount("123456",DrawMoneyRunnabledrawMoneyRunnable=newThreadmyThread1=newThreadmyThread2=newThread(drawMoneyRunnable);}14classDrawMoneyRunnableimplementsRunnable33privateAccountprivatedoublepublicDrawMoneyRunnable(Accountaccount,doubledrawAmount)this.account=account;this.drawAmount=drawAmount;}publicvoidrun()if(account.getBalance()>=drawAmount){//1System.out.printlndrawAmount);doublebalance=account.getBalance()-drawAmount;System.out.println}}35classAccount privateStringJava多线程中的线程安全问题。一.Java线程安全例子65privatedoublepublicAccount()}publicAccount(StringaccountNo,doublebalance){this.accountNo=accountNo;this.balance=}publicStringgetAccountNo(){returnaccountNo;}publicvoidsetAccountNo(StringaccountNo){this.accountNo=accountNo;}publicdoublegetBalance(){returnbalance;}publicvoidsetBalance(doublebalance){this.balance=balance;}也就是说,对于一张只有1000余额的, Java多线程环境下的执行的不确定性。CPU可能随机的在多个处于thread1执行到//1处代trueCPUthread2,执行//1处代码,发现依然为真,然thread2thread1,接着执行完毕。此时,就会出现上述结果。。对共享资源进行的方法定义中加上synchronized关键字修饰,使得此方法称为同步方1publicsynchronizedvoidrun()1publicsynchronizedvoidrun(){ //4511synchronized(obj){ 45account对象作为锁对象。(this也是可以的,那是因runnableThreadthis1classX{Lock1classX{3345678916privatefinalLocklock=newpublicvoid//...}在博文《Java总结篇系列:java.lang.Object》中有提及到这三个方法,虽然这三个方法主ObjectObjectnotify()或notifyAll()方法来唤醒此线程。1package21package23publicclassThreadTest{56789publicstaticvoidmain(String[]args)Accountaccount=newAccount("123456",ThreaddrawMoneyThreadnewDrawMoneyThread("ThreaddepositeMoneyThreadnewDepositeMoneyThread(account,}15classDrawMoneyThreadextendsThread{privateAccountprivatedoubleamount; publicDrawMoneyThread(StringthreadName,Accountaccount,doubleamount){ this.account= this.amount= publicvoidrun() for(inti=0;i<100;i++) account.draw(amount, 3335classDepositeMoneyThreadextendsThread{ privateAccount privatedoubleamount; publicDepositeMoneyThread(StringthreadName,Accountaccount,doubleamount){ this.account= this.amount= publicvoidrun() for(inti=0;i<100;i++) account.deposite(amount, 5153classAccount{ privateStringprivatedoubleprivatebooleanflag=publicAccount()}publicAccount(StringaccountNo,doublebalance)this.accountNo=this.balance=}publicStringgetAccountNo()return}publicvoidsetAccountNo(StringaccountNo)this.accountNo=}publicdoublegetBalance()return}publicvoidsetBalance(doublebalance)this.balance=}***@parampublicsynchronizedvoiddeposite(doubleinti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 硬件升级与软件培训并重提升教育领域职业技能
- 长期合作协议:2025年度跨境电子商务平台建设
- 二零二五年度时尚模特艺人签约合同书
- 电梯拆装合同范本
- 2025至2030年中国网管监控软件数据监测研究报告
- 2025年度金融投资股权分红及风险控制管理合同
- 2025年度智能办公家具定制与采购合同
- 2025年度码头场地租赁合同:含信息化管理的对外出租及数据服务协议
- 2025年度金融行业劳务派遣安全免责协议
- 2025年度焊接加工行业人才培养合作合同
- 托管岗前培训教学课件
- 机房运维管理制度
- 昆明抚仙湖鳍鱼湾棋盘山度假娱乐旅游区总体规划方案样本
- 人教版一年级下册数学第一单元单元作业设计
- 创鲁班奖工程条件及评审要求XX4
- 交通法规常识课件
- 北师大版数学四年级下册简易方程练习200题及答案
- 课件:认识镜头语言1:运镜方式和常用的镜头术语
- (完整版)三年级上册口算题卡1400道
- 淘宝客服转正述职报告
- 提升电子商务的发展逻辑
评论
0/150
提交评论