Java教程线程入门_第1页
Java教程线程入门_第2页
Java教程线程入门_第3页
Java教程线程入门_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

Java教程线程入门 Java教程_线程入门作者点击数1613更新时间xx-6-15线程是Java的内嵌特性,线程并不容易掌握,有专门介绍Java线程的书籍,读者可以参考。 由此可见Java线程的重要性,本文将详细介绍线程的基本知识。 有的时候你可能想写一个程序,每隔一段时间执行相关的任务,这个时候你可以使用Timer和TimerTask,非常方便。 你可以参考这里。 在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。 下面是代码示例public classDoSomething implementsRunnablepublic voidrun()/here iswhere youdo somethingpublic classDoAnotherThing extendsThreadpublic voidrun()/here iswhere youdo something这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。 Java中的线程有四种状态分别是运行、就绪、挂起、结束。 如果一个线程结束了也就说明他是一个死线程了。 当你调用一个线程实例的start()的方法的时候,这个时候线程进入就绪状态,注意并不是运行状态,当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态,当线程进入等待状态,例如等待某个事件发生的时候,这时候线程处于挂起状态。 启动一个线程你只需要调用start()方法,针对两种实现线程的方法也有两种启动线程的方法,分别如下DoSomething doIt=new DoSomething();Thread myThread=new Thread(doIt);myThread.start();DoAnotherThing doIt=new DoAnotherThing();doIt.start();由于安全等因素Thread中的stop()方法已经不推荐使用了,因此如果你想要停止一个线程的时候可以通过设置一个信号量,例如public classMyThread implementsRunnableprivate booleanquit=false;public voidrun()while(!quit)/do somethingpublic voidquit()quit=true;如果每个线程只做它自己的事情,那么就很简单了,但是有的时候几个线程可能要同时访问一个对象并可能对它进行修改,这个时候你必须使用线程的同步在方法或者代码块使用关键字synchronized,例如public classCounterprivate intcounter;public synchronizedint increment()return+counter;public synchronizedint decrement()if(-counter0)counter=0;return counter;每个java对象都可以最为一个监视器,当线程访问它的synchronized方法的时候,他只允许在一个时间只有一个线程对他访问,让其他得线程排队等候。 这样就可以避免多线程对共享数据造成破坏。 记住synchronized是会耗费系统资源降低程序执行效率的,因此一定要在需要同步的时候才使用,尤其在J2ME的开发中要小心。 如果你要是想让线程等待某个事件的发生然后继续执行的话,那么这就涉及到线程的调度了。 在java中通过wait(),notify(),notifyAll()来实现,这三个方法是在Object类中定义的,当你想让线程挂起的时候调用obj.wait()方法,在同样的obj上调用notify()则让线程重新开始运行。 最后以SUN提供的Producer/Consumer的例子来结束这篇文章,内容是Producer产生一个数字而Consumer消费这个数字,这个小程序里面基本覆盖了本文所有的知识点。 请详细研究一下代码public classProducer extendsThreadprivate CubbyHole cubbyhole;private int number;public Producer(CubbyHole c,int number)cubbyhole=c;this.number=number;public voidrun()for(int i=0;i10;i+)cubbyhole.put(i);System.out.println(Producer#+this.number+put:+i);trysleep(int)(Math.random()*100);catch(InterruptedException e)public classCubbyHoleprivate int contents;private booleanavailable=false;public synchronizedint get()while(available=false)trywait();catch(InterruptedException e)available=false;notifyAll();return contents;public synchronizedvoid put(int value)while(available=true)trywait();catch(InterruptedException e)contents=value;available=true;notifyAll();public classConsumer extendsThreadprivate CubbyHole cubbyhole;private intnumber;public Consumer(CubbyHolec,intnumber)cubbyhole=c;this.number=number;public voidrun()int value=0;for(int i=0;i10;i+)value=cubbyhole.get();System.out.println(Consumer#+this.number+got:+value);public classProducerConsumerTestpublic staticvoid main(Stringargs)CubbyHolec=new CubbyHole();Producer p1=new Producer(c,1);Consumer c1=new Consumer(c,1);p1.start();c1.start();SUN说输出的结果应该是如下形式,但是在我的机器上却不是这样的,做了一些改动才正确,有兴趣的朋友可以运行一下看看结果,欢迎和我讨论一下!Producer#1put:0Consumer#1got:0Producer#1put:1Consumer#1got:1Producer#1put:2Consumer#1got:2Producer#1put:3Consumer#1got:3Producer#1put:4Consumer#1got:

温馨提示

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

最新文档

评论

0/150

提交评论