【叶凡网络】对于Java中Thread,Runnable的区别

2014-02-21 11:30:59 | 新闻来源:叶凡网络 | 点击量:954

发现Thread类也是Runnabl接口的子类。一种是继承Thread类,java中可有两种方式实现多线程。一种是实现Runnabl接口;Thread类是java.lang包中定义的一个类只要继承了Thread类同时覆写了本类中的run方法就可以实现多线程操作了但是一个类只能继承一个父类,这是此方法的局限。

下面看例子:

packagorg.thread.demo; 

classMyThreadextendThread{ 

privatStringname; 

publicMyThreadStringname{ 

super; 

this.nam=name; 

publicvoidrun{ 

forinti=0;i<10;i++{ 

i="+i; System.out.println"线程开始:"+this.name+".

packagorg.thread.demo; 

publicclassThreadDemo01{ 

publicstaticvoidmainString[]arg{ 

MyThreadmt1=newMyThread"线程a"; 

MyThreadmt2=newMyThread"线程b"; 

mt1.run; 

mt2.run; 

}

先第一个对象执行,但是此时结果很有规律。然后第二个对象执行,并没有相互运行。JDK文档中可以发现,一旦调用start方法,则会通过JVM找到run方法。下面启动start方法启动线程:

packagorg.thread.demo; 

publicclassThreadDemo01{ 

publicstaticvoidmainString[]arg{ 

MyThreadmt1=newMyThread"线程a"; 

MyThreadmt2=newMyThread"线程b"; 

mt1.start; 

mt2.start; 

};

这样顺序可以正常完成交互式运行。那么为啥非要使用start;方法启动多线程呢?

src.zip全部的java源程序,JDK装置路径下。通过此代码找到Thread中的start方法的定义,可以发现此方法中使用了privatnativvoidstart0;其中nativ关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(javaNativInterfac

下面看例子:如果用Runnabl就可以实现资源共享。

packagorg.demo.runnable; 

classMyThreadimplementRunnable{ 

privatintticket=10; 

publicvoidrun{ 

forinti=0;i<20;i++{ 

ifthis.ticket>0{ 

System.out.println"卖票:ticket"+this.ticket--; 

packagorg.demo.runnable; 

publicclassRunnableTicket{ 

publicstaticvoidmainString[]arg{ 

MyThreadmt=newMyThread; 

如果用同一 newThreadmt.start;//同一个mt但是Thread中就不可以。

newThreadmt.start;//个实例化对象mt就会出现异常 

newThreadmt.start; 

};

但是一共卖了10张票,虽然现在顺序中有三个线程。也就是说使用Runnabl实现多线程可以达到资源共享目的

Runnabl接口

而是通过Runnabl接口完成。实际开发中一个多线程的操作很少使用Thread类。

publicinterfacRunnable{ 

publicvoidrun; 

}

例子:

packagorg.runnable.demo; 

classMyThreadimplementRunnable{ 

privatStringname; 

publicMyThreadStringname{ 

this.nam=name; 

}

publicvoidrun{ 

forinti=0;i<100;i++{ 

i="+i; System.out.println"线程开始:"+this.name+".

};

只有Thread类中才有。此时观察Thread类,但是使用Runnabl定义的子类中没有start方法。有一个构造方法:publicThreadRunnabltarger此构造方法接受Runnabl子类实例,也就是说可以通过Thread类来启动Runnabl实现的多线程。start可以协调系统的资源)

packagorg.runnable.demo; 

importorg.runnable.demo.MyThread; 

publicclassThreadDemo01{ 

publicstaticvoidmainString[]arg{ 

MyThreadmt1=newMyThread"线程a"; 

MyThreadmt2=newMyThread"线程b"; 

newThreadmt1.start; 

newThreadmt2.start; 

}

两种实现方式的区别和联系:

因为实现Runnabl接口相比继承Thread类有如下好处:顺序开发中只要是多线程肯定永远以实现Runnabl接口为主。

一个类可以继承多个接口。防止点继承的局限。

适合于资源的共享

通过Thread类完成:以卖票程序为例。

packagorg.demo.dff; 

classMyThreadextendThread{ 

privatintticket=10; 

publicvoidrun{ 

forinti=0;i<20;i++{ 

ifthis.ticket>0{ 

System.out.println"卖票:ticket"+this.ticket--; 

};

同时卖票:下面通过三个线程对象。

packagorg.demo.dff; 

publicclassThreadTicket{ 

publicstaticvoidmainString[]arg{ 

MyThreadmt1=newMyThread; 

MyThreadmt2=newMyThread; 

MyThreadmt3=newMyThread; 

共卖了30张票 mt1.start;//每个线程都各卖了10张。

每个线程都卖自己的票 mt2.start;//但实际只有10张票。

mt3.start;//没有达到资源共享 

}

Runnabl接口和Thread之间的联系:

 

publicclassThreadextendObjectimplementRunnable

上一篇:【叶凡网络】西班牙专家制“便便香肠”是从婴儿粪便中提取物质 下一篇:【叶凡网络】执行成果总结会,两岸两会举行协议