认识多线程进程是程序一次动态执行过程它经历了从代码加载、到执_第1页
认识多线程进程是程序一次动态执行过程它经历了从代码加载、到执_第2页
认识多线程进程是程序一次动态执行过程它经历了从代码加载、到执_第3页
认识多线程进程是程序一次动态执行过程它经历了从代码加载、到执_第4页
认识多线程进程是程序一次动态执行过程它经历了从代码加载、到执_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

进程与线过程中可以产生多个更小的程序单元,这些更小的单元称为线程,执行的线程。进程与线程的区别如下图所示; Java中线程的实在java中要想实现多线程的操作有两种手段,一种是继承Thread1.继承Threadclass类名称extendsThread{ //继承Thread类属性…; //类中定义属性方法… //类中定义方覆写Thread类中的run()publicvoid线程主体}}classMyThreadextendsThread{privateStringname;publicMyThread(String}publicvoidfor(inti=0;i<10;i++)System.out.println(name+"运行}}}publicclassTestpublicstaticvoidmain(String[]args){MyThreadmt1newMyThread("线程A");MyThreadmt2newMyThread("线程B");}}classMyThreadextendsprivateStringpublicMyThread(String}publicvoidfor(inti=0;i<10;i++)System.out.println(name+"运行}}}publicclassTestpublicstaticvoidmain(String[]args){MyThreadmt1newMyThread("线程A");MyThreadmt2newMyThread("线程B");}为什么启动线程不能直接使用run()我们首先来看一下start()publicsynchronizedvoidstart()if(threadStatus!=throw}privatenativevoid。:publicclassTestpublicstaticvoidmain(String[]args){MyThreadmt1newMyThread("线程A");}}Exceptioninthread"main"atjavalangThreadstart(Thread以上的错误本身并不难理解,只要参照Thread,如果一个类只能继承Thread2.实现Runnablepublicvoidrun();通过RunnableclassimplementsRunnable{//实现Runnable属性… //类中定义属方法… //类中定义方publicvoid //覆写Runnable }}通过RunnableclassMyThreadimplementsRunnable{privateStringname;publicMyThread(String}publicvoidfor(inti=0;i<10;i++)System.out.println(name+"运行}}}以上代码通过实现RunnablepublicThread(Runnabletarget)和publicThread(Runnabletarfget,Stringname)两个构造方法。这两个构造方法都可以接收publicclassTest{publicstaticvoidmain(String[]args){MyThreadmt1newMyThread("线程A");MyThreadmt2newMyThread("线程B");Threadt1=newThread(mt1);Threadt2=new}}线程A运行Thread类和Runnable接通过Thread类和RunnablepublicclassThreadextendsObjectimplementsprivateRunnabletarget;publicThread(Runnabletarget,Stringname)init(null,target,name,}privatevoidinit(ThreadGroupg,Runnabletarget,name,longstackSize)this.target=}publicvoidrun()if(target!=null)}}Runnab从定义中可以发现,在Threadrun方法调用的是nnab接口中的run方法,也就是说此方法是由nnabe子类完成的,所以如果要通过继承Thread类实现多线程,则必须覆写runThead和nnabe的子类都实现了RunnabclassMyThreadextendsThread{privateintticket=5;publicvoidrun(){if(ticket>0){System.out.println("卖票:ticket="+ticket}}}}publicclassTestpublicstaticvoidmain(String[]args){MyThreadmt1=newMyThread();MyThreadmt2=newMyThread();MyThreadmt3=newMyThread();}}以上程序通过Thread类实现多线程,程序中启动3个线程,但是3个线程却卖了各自的5张票,并没有达到资源共享的目的classMyThreadimplementsRunnable{privateintticket=5;publicvoidrun(){if(ticket>0){System.out.println("卖票:ticket="+ticket}}}}publicclassTestpublicstaticvoidmain(String[]MyThreadmy=newMyThread();newThread(my).start();newThread(my).start();new}}从程序的运行结果中可以清楚的发现,虽然自动了个线程,但是卖了五张票,即tckt属性被所有的线程对象共享。可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优适合多个相同程序代码的线程去处理同一资源的情况可以避免由于java的单继承特性带来的局限线程的状来实现,例如:Threadt=newThread();新建线程对象后,调用该线程的start()线程操作的相关方取得和设置线程名在Thread类中,可以通过getName()setName()取得和设置线程名称classMyThreadimplementspublicvoidfor(int+"运行}}}publicclassTestpublicstaticvoidmain(String[]MyThreadmy=newnewnewThread(my,"线程-newThread(my).start();}}Thread-1了解以上代码之后,下面我们来观察以下的代码观察程序的输出classMyThreadimplementspublicvoidrun(){for(inti=0;i<3;i++){+"}}}publicclassTestpublicstaticvoidmain(String[]MyThreadmynewMyThread();newThread(my,"线程").start();}}nale接口的子类对象调用其中的r()另外一个是通过线程对象调用start()方法启动的,从结果中发现,主方法实际上jaa中所有的线程都是同时启动的,哪个线程先抢占到了U资源,哪个线程先运行。Java程序每次运行至少启动几个线程因为jva是多线程的编程语言,所以jaa程序运行时也是以多线程的方式运行的,那么主方法也就是一个线程(m),但是对于一个jaa程序来说,一个jaa程序运行至少会启动几个线程?至少启动两个线jaa命令执行一个类时,实际上都会启动一个J,每个J实际上就是在操作系统中启动了一个进程,j本身具备了垃j运行时至少启动两个线程,一个是m线程。另外一个是垃圾回收线程。判断线程是否启通过前面的讲解可知,通过T类中的start()方法通知CPU这个线程已经准备好启动,然后等待分配Ujaa中可以使用sAlv)方法来测试线程是否已经启动而且仍然在运行。判断线程是否启动classMyThreadimplementspublicvoidrun(){for(inti=0;i<3;i++){+"}}}publicclassTestpublicstaticvoidmain(Stringargs){MyThreadmy=newMyThread();Threadt=newThread(my,"线程");System.out.println("线程开始执行之前System.out.println("线程开始执行之后--for(inti=0;i<3;i++)System.out.println("main运行--}System.out.println("代码执行之后程序运行结果main运行--main运行--线程运行线程运行以上输出结果是不确定的,有可能最后线程已经不存活了,但也有可能继续存活这就要看哪个线程先执行完注意:主线程有可能比其他线程先执行完不会受到任何影响,并不会随着主线程的结束而结束。线程的强制运线程的强制运行classMyThreadimplementspublicvoidfor(int+"运行}}}publicclassTestpublicstaticvoidmain(Stringargs){MyThreadmy=newMyThread();Threadt=newThread(my,"线程");for(inti=0;i<50;i++)if(i>10){try{}catch(Exceptione)//TODO:handle}}System.out.println("main线程运行}}}线程的休classMyThreadimplementspublicvoidrun(){try{+"运行}catch(InterruptedExceptione)//TODOAuto-generatedcatch}}}}publicclassTestpublicstaticvoidmain(Stringargs){MyThreadmy=newMyThread();Threadt=newThread(my,"线程");}}以上程序执行时,每次的输出都会间隔500ms,达到了延迟操作的效中断线classMyThreadimplementspublicvoidrun(){try{System.out.println("2.已经完成休眠}catch(InterruptedExceptione)TODOAuto-generatedcatchblockreturn;}System.out.println("4.run方法正常结束}}publicclassTestpublicstaticvoidmain(Stringargs){MyThreadmy=newMyThread();Threadt=newThread(my,"线程");try}catch(InterruptedExceptione)}}}程序运行结果1.进入run方3.休眠被中s之ccrtn语句返回程序调用处。后台线classMyThreadimplementspublicvoidrun(){System.out.println(Thread.currentThread().getName()+"在运行}}}publicclassTestpublicstaticvoidmain(Stringargs){MyThreadmy=newMyThread();Threadt=newThread(my,"线程");}}在线程类MyThread中,尽管run()方法中是死循环的方式,但是程序依然可以行完毕,因为方法中的死循环的线程操作已经设置成后台运行线程的优先classMyThreadimplementsRunnable{publicvoidrun(){for(inti=0;i<5;i++){try{}catch(InterruptedExceptione)}"}}}publicclassTestpublicstaticvoidmain(String[]Threadt1newThread(newMyThread(),"线程A");Threadt2newThread(newMyThread(),"线程B");Threadt3newThread(newMyThread(),"线程C");}}线程A线程A运行从以上程序的运行结果可以知道,线程将根据其优先级的大小来决定哪个线程先运行,但是一定

温馨提示

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

评论

0/150

提交评论