extends Thread与implements Runnable

dreamhunter_lan 2009-03-16 01:02:16
一个类(假如叫ThreadAndRunnable)extends Thread与implements Runnable,我有几点看法:
1、如果extends Thread后就不能extends其他类了
2、如果implements Runnable,那还是要将一个ThreadAndRunnable对象传到Thread的构造方法中,new出一个线程对象,
并调用start()方法才能启动那个ThreadAndRunnable实例对应的线程(能这样叫不?)
3、有人说implements Runnable能让多个线程共享一个ThreadAndRunnable实例,但我认为extends Thread时把相应的field声明为static也可以实现一样的功能,比如下面两段代码的功能是一样的:

class ThreadAndRunnable implements Runnable {
private int x = 0;
public void run() {
System.out.println(++x);
}
}

public class Test {
public static void main(String[] args){
ThreadAndRunnable r = new ThreadAndRunnable();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(r);
t.start();
}
}
}




class ThreadAndRunnable extends Thread {
private static int x = 0;
public void run() {
System.out.println(++x);
}
}

public class Test {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread t = new ThreadAndRunnable();
t.start();
}
}
}

总之,我觉得除了上面1、2两点外,这两种方式没有区别了,希望大家帮忙,让我走出误区~
...全文
2883 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruikangdotdai 2011-06-30
  • 打赏
  • 举报
回复
学习了,2楼说的好
afeng848 2010-04-01
  • 打赏
  • 举报
回复
感觉implements Runnable 和 extends Thread 还是有区别的 比如这两种分别调用 Thread.currentThread().getName()方法 结果不一样
mujiankang000 2009-11-21
  • 打赏
  • 举报
回复
学习
wz43556392 2009-09-01
  • 打赏
  • 举报
回复
学习
yangyangsasa 2009-06-22
  • 打赏
  • 举报
回复
呵呵,解释得很好,学习了。
wclszh 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangnaisong 的回复:]
答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.

1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务. ---对应着:要做的工作

2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.…
[/Quote]
不错,从着眼点来分析,开阔思路!。
sagezk 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangnaisong 的回复:]
答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.
1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务.  ---对应着:要做的工作
2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着…
[/Quote]

jiangnaisong 很形象的解释。
Csdbfans 2009-03-17
  • 打赏
  • 举报
回复
一种是通过接口的方法实现,而另一个则是通过多态实现,当然从LZ的例子看结果的话是没什么差别,不过就多态来讲,父类引用指向子类对象(一个接口,多种实现),也就是说凡是继承了接口的类,都能够用接口的实现类来作为对象来赋值给接口的引用。对线程不熟,不知道上面的程序关键的不同是在哪,就一个外观感悟来讲,只是两种实现手段
dreamhunter_lan 2009-03-17
  • 打赏
  • 举报
回复
谢谢各位大牛了~
chxy148 2009-03-16
  • 打赏
  • 举报
回复
学习
wclszh 2009-03-16
  • 打赏
  • 举报
回复
学习。
oklinsong 2009-03-16
  • 打赏
  • 举报
回复
学习。
不善^ 2009-03-16
  • 打赏
  • 举报
回复
1、如果extends Thread后就不能extends其他类了
还有 用接口 只有一个方法
extends 不用new了 直接start
我也就知道这些 呵呵
看了楼主的帖子又明白了一些不知道的
dawn023 2009-03-16
  • 打赏
  • 举报
回复
只是语法上的区别。
云上飞翔 2009-03-16
  • 打赏
  • 举报
回复
答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.

1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务. ---对应着:要做的工作

2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着眼点是:线程的功能(通过继承来扩展执行其它计算任务的能力) ---对应着:做工作的工作人员

3)当然:若一个类已有父亲,不能再从Thread类继承,只好实现Runnable接口来达到线程的目的,这是一种选择了.

以上仅是从设计代码的一种意图上说明,仅供你参考.
Johnson_Hong 2009-03-16
  • 打赏
  • 举报
回复
那你要实现下面的功能,是不是又要想另想办法呢?我觉得runable 把要执行的过程的数据和代码封装起来,体现了一种良好的思想,并不在于你通过别的方法能不能达到相同的功能。
public class Test {
public static void main(String[] args){
ThreadAndRunnable r = new ThreadAndRunnable();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(r);
t.start();
}
ThreadAndRunnable r2 = new ThreadAndRunnable();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(r2);
t.start();
}
}
}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧