您的位置:网大 >> 网络 >> 网络大全 >> 正文

Java教程_线程入门

作者:不详时间:2006-2-21 11:02:44

线程是Java的内嵌特性,线程并不容易掌握,有专门介绍Java线程的书籍,读者可以参考。由此可见Java线程的重要性,本文将详细介绍线程的基本知识。

有的时候你可能想写一个程序,每隔一段时间执行相关的任务,这个时候你可以使用Timer和TimerTask,非常方便。你可以参考这里。

在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。下面是代码示例:


publicclassDoSomethingimplementsRunnable{
publicvoidrun(){
//hereiswhereyoudosomething
}
}
publicclassDoAnotherThingextendsThread{
publicvoidrun(){
//hereiswhereyoudosomething
}
}


这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。如果一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的start()的方法的时候,这个时候线程进入就绪状态,注意并不是运行状态,当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态,当线程进入等待状态,例如等待某个事件发生的时候,这时候线程处于挂起状态。

启动一个线程你只需要调用start()方法,针对两种实现线程的方法也有两种启动线程的方法,分别如下:


DoSomethingdoIt=newDoSomething();
ThreadmyThread=newThread(doIt);
myThread.start();
DoAnotherThingdoIt=newDoAnotherThing();
doIt.start();

 

由于安全等因素Thread中的stop()方法已经不推荐使用了,因此如果你想要停止一个线程的时候可以通过设置一个信号量,例如:


publicclassMyThreadimplementsRunnable{
privatebooleanquit=false;
publicvoidrun(){
while(!quit){
//dosomething
}
}

publicvoidquit(){
quit=true;
}
}


如果每个线程只做它自己的事情,那么就很简单了,但是有的时候几个线程可能要同时访问一个对象并可能对它进行修改,这个时候你必须使用线程的同步在方法或者代码块使用关键字synchronized,例如:


publicclassCounter{
privateintcounter;
publicsynchronizedintincrement(){
return++counter;
}

publicsynchronizedintdecrement(){
if(--counter<0){
counter=0;
}

returncounter;
}
}


每个java对象都可以最为一个监视器,当线程访问它的synchronized方法的时候,他只允许在一个时间只有一个线程对他访问,让其他得线程排队等候。这样就可以避免多线程对共享数据造成破坏。记住synchronized是会耗费系统资源降低程序执行效率的,因此一定要在需要同步的时候才使用,尤其在J2ME的开发中要小心。

如果你要是想让线程等待某个事件的发生然后继续执行的话,那么这就涉及到线程的调度了。在java中通过wait(),notify(),notifyAll()来实现,这三个方法是在Object类中定义的,当你想让线程挂起的时候调用obj.wait()方法,在同样的obj上调用notify()则让线程重新开始运行。最后以SUN提供的Producer/Consumer的例子来结束这篇文章,内容是Producer产生一个数字而Consumer消费这个数字,这个小程序里面基本覆盖了本文所有的知识点。请详细研究一下代码


publicclassProducerextendsThread{
privateCubbyHolecubbyhole;
privateintnumber;
publicProducer(CubbyHolec,intnumber){
cubbyhole=c;
this.number=number;
}

publicvoidrun(){
for(inti=0;i<10;i++){
cubbyhole.put(i);
System.out.println("Producer#"+this.number
+"put:"+i);
try{
sleep((int)(Math.random()*100));
}catch(InterruptedExceptione){}
}
}
}


publicclassCubbyHole{
privatei


评论数: 来源:不详

关键字:Java
相关文章

网大首页 - 网站地图 - 广告服务 - 关于网大 - 招聘信息 - 联系我们
Copyright (C) 1999-2005 NETBIG.COM (CHINA) LIMITED All Rights Reserved
粤B-20050190