﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-cooperzh-随笔分类-Thread</title><link>http://www.blogjava.net/cooperzh/category/50428.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Dec 2011 18:39:51 GMT</lastBuildDate><pubDate>Tue, 27 Dec 2011 18:39:51 GMT</pubDate><ttl>60</ttl><item><title>extends Thread与implements Runnable 区别（转自CSDN）</title><link>http://www.blogjava.net/cooperzh/archive/2011/12/22/366993.html</link><dc:creator>cooperzh</dc:creator><author>cooperzh</author><pubDate>Thu, 22 Dec 2011 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/cooperzh/archive/2011/12/22/366993.html</guid><wfw:comment>http://www.blogjava.net/cooperzh/comments/366993.html</wfw:comment><comments>http://www.blogjava.net/cooperzh/archive/2011/12/22/366993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperzh/comments/commentRss/366993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperzh/services/trackbacks/366993.html</trackback:ping><description><![CDATA[出处：<a href="http://topic.csdn.net/u/20090316/13/37e19f74-470f-4e9e-b5b7-508fe92ac3eb.html">http://topic.csdn.net/u/20090316/13/37e19f74-470f-4e9e-b5b7-508fe92ac3eb.html<br /></a><br />问：<br /><div><div>一个类（假如叫ThreadAndRunnable）extends Thread与implements Runnable，我有几点看法：</div><div>1、如果extends Thread后就不能extends其他类了</div><div>2、如果implements Runnable，那还是要将一个ThreadAndRunnable对象传到Thread的构造方法中，new出一个线程对象，</div><div>&nbsp; 并调用start()方法才能启动那个ThreadAndRunnable实例对应的线程(能这样叫不？)</div><div>3、有人说implements Runnable能让多个线程共享一个ThreadAndRunnable实例，但我认为extends Thread时把相应的field声明为static也可以实现一样的功能，比如下面两段代码的功能是一样的：</div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ThreadAndRunnable&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Runnable&nbsp;{<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(++x);<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args){<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadAndRunnable&nbsp;r&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadAndRunnable();<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;t&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread(r);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start();<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;}</div><br /><div><span style="font-family: simsun; font-size: 14px; line-height: 23px; text-align: left; background-color: #ffffff; ">与<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ThreadAndRunnable&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Thread&nbsp;{<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(++x);<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;t&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadAndRunnable();<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start();<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;</div><span style="font-family: simsun; font-size: 14px; line-height: 23px; text-align: left; background-color: #ffffff; "><br /></span><div><span style="font-size: 14px; ">总之，我觉得除了上面1、2两点外，这两种方式没有区别了，希望大家帮忙，让我走出误区～<br /><br /><br /><br /></span></div><span style="font-family: simsun; font-size: 14px; line-height: 23px; text-align: left; background-color: #ffffff; "><br /></span>答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.</div><div><div></div><div>1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务. ---对应着:要做的工作</div><div></div><div>2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着眼点是:线程的功能(通过继承来扩展执行其它计算任务的能力) ---对应着:做工作的工作人员</div><div></div><div>3)当然:若一个类已有父亲,不能再从Thread类继承,只好实现Runnable接口来达到线程的目的,这是一种选择了.</div><div></div><div>以上仅是从设计代码的一种意图上说明,仅供你参考.<br /><br />以下摘自jdk doc:<br /><div><p style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; "><code>Runnable</code>&nbsp;接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为&nbsp;<code>run</code>&nbsp;的无参数方法。</p><p style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; ">设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如，<code>Thread</code>&nbsp;类实现了&nbsp;<code>Runnable</code>。激活的意思是说某个线程已启动并且尚未停止。</p><p style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; ">此外，<code>Runnable</code>&nbsp;为非&nbsp;<code>Thread</code>&nbsp;子类的类提供了一种激活方式。通过实例化某个&nbsp;<code>Thread</code>&nbsp;实例并将自身作为运行目标，就可以运行实现&nbsp;<code>Runnable</code>&nbsp;的类而无需创建<code>Thread</code>&nbsp;的子类。大多数情况下，如果只想重写&nbsp;<code>run()</code>&nbsp;方法，而不重写其他&nbsp;<code>Thread</code>&nbsp;方法，那么应使用&nbsp;<code>Runnable</code>&nbsp;接口。这很重要，因为除非程序员打算修改或增强类的基本行为，否则不应为该类创建子类。</p></div><br /><br /></div></div><img src ="http://www.blogjava.net/cooperzh/aggbug/366993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperzh/" target="_blank">cooperzh</a> 2011-12-22 10:40 <a href="http://www.blogjava.net/cooperzh/archive/2011/12/22/366993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>