实现 Runnable 接口和继承Thread 类的线程有什么区别

时间:2020-11-27 17:35:04
1。我看有的线程是实现了 Runable 接口,然后在新的类里重写 run方法
2。而有的线程是直接继承Thread类,如
Thread newThread = new Thread()
{
  public void run()
  {
    //。。。
  }
}

第一种显得不如第二种方法灵活
他们到底有什么区别阿
还有,我想问一下阿,实现了Runable接口的类,一般都还继承了其他的许多类,比如public class MyCanvas extends Canvas implements Runnable。我问一下阿,是不是这些类一 new,run 方法就要运行呢?

18 个解决方案

#1


呵呵,没有什么不同,两种不同的实现手段
Runnable是Thread的接口,在大多数情况下都喜欢用接口去生成线程,接口可以多继承么。
----》》》我问一下阿,是不是这些类一 new,run 方法就要运行呢?
Thread Test = new Thread(); 
Test.start(); 
在使用Runnable的时候需要先new一个实现Runnable的实例,然后调用Thread构造函数。 
A impelements Runnable 
A a= new A(); 
Thread xx= new Thread(a); 

#2


java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别
只有在调用了start方法后,线程才进入可运行状态(此时不一定会运行),当cpu时间片到的时候才会自动调用run方法,代码中无需调用run方法

#3


作用相同,方式不同而已。

#4


两种方式都可以的。
如果你用继承Thread的方式,那你就不能继承其他的类了。
我比较喜欢用实现接口的方式。

#5


heroboy0923说得对

就是你想继承一个别的类,同时还要多线程的时候,你只能选择从Runnable这种方式

#6


写法不同而已。

#7


当你的系统中有多个县城切换的时候 最好事先runable接口,这个和java的多态性可以很好的结合
当你只有一个线程的时候就集成thread即可,因为他没有交替的资源访问

#8


表面就一个run方法的区别

#9


2种差不多吧,不过如果你写的这个类还要继承其他的类,那么它只能用接口来实现,因为java中不可以实现多继承。这也是java中提出的一种对单继承的解决方案吧

#10


谢谢楼上各位的回答阿
我想知道:
继承Thread方法的线程t,需要手工t.start来启动该线程
实现了Runnable方法的线程tt,也需要手工tt.start来启动吗?

#11


这两种方式都可以:
Thread.start(你自己写的线程类的实例)
这样启动。注意,start是静态方法。

#12


引用 2 楼 heroboy0923 的回复:
java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别
只有在调用了start方法后,线程才进入可运行状态(此时不一定会运行),当cpu时间片到的时候才会自动调用run方法,代码中无需调用run方法

就是这样的

#13


bang mang ding ding ,xiexie 

#14


接口可以实现多继承

#15


引用 10 楼 onlyonelove 的回复:
谢谢楼上各位的回答阿
我想知道:
继承Thread方法的线程t,需要手工t.start来启动该线程
实现了Runnable方法的线程tt,也需要手工tt.start来启动吗?


1.直接继承时:
Thread t = new Thread(); 
t.start(); //使线程进入就绪状态,等待CPU时间片
2.在使用Runnable的时候需要先new一个实现Runnable的实例,然后调用Thread构造函数。 
A impelements Runnable 
A a= new A(); 
Thread tt= new Thread(a);
tt.start(); //使线程进入就绪状态,等待CPU时间片

#16


实现方法不同

#17


实现功能都一样,但是runnable是面向接口,扩展性等方面比extends Thread好,简单的说因为Java是单继承,如果你一个类,需要实现线程,又要继承一个类,显然,使用Thread是不行的。建议使用Runnable面向接口的!

#18


1.A impelements Runnable  
A a= new A();  
Thread xx= new Thread(a);
Thread yy= new Thread(a);
xx.start();
yy.start(); 

2. A impelements Runnable  
A a= new A(); 
A a1= new A(); 
Thread xx= new Thread(a);
Thread yy= new Thread(a1);
xx.start();
yy.start();
请问什么时候适用第一种情况,什么时候适用第2种情况? 

#1


呵呵,没有什么不同,两种不同的实现手段
Runnable是Thread的接口,在大多数情况下都喜欢用接口去生成线程,接口可以多继承么。
----》》》我问一下阿,是不是这些类一 new,run 方法就要运行呢?
Thread Test = new Thread(); 
Test.start(); 
在使用Runnable的时候需要先new一个实现Runnable的实例,然后调用Thread构造函数。 
A impelements Runnable 
A a= new A(); 
Thread xx= new Thread(a); 

#2


java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别
只有在调用了start方法后,线程才进入可运行状态(此时不一定会运行),当cpu时间片到的时候才会自动调用run方法,代码中无需调用run方法

#3


作用相同,方式不同而已。

#4


两种方式都可以的。
如果你用继承Thread的方式,那你就不能继承其他的类了。
我比较喜欢用实现接口的方式。

#5


heroboy0923说得对

就是你想继承一个别的类,同时还要多线程的时候,你只能选择从Runnable这种方式

#6


写法不同而已。

#7


当你的系统中有多个县城切换的时候 最好事先runable接口,这个和java的多态性可以很好的结合
当你只有一个线程的时候就集成thread即可,因为他没有交替的资源访问

#8


表面就一个run方法的区别

#9


2种差不多吧,不过如果你写的这个类还要继承其他的类,那么它只能用接口来实现,因为java中不可以实现多继承。这也是java中提出的一种对单继承的解决方案吧

#10


谢谢楼上各位的回答阿
我想知道:
继承Thread方法的线程t,需要手工t.start来启动该线程
实现了Runnable方法的线程tt,也需要手工tt.start来启动吗?

#11


这两种方式都可以:
Thread.start(你自己写的线程类的实例)
这样启动。注意,start是静态方法。

#12


引用 2 楼 heroboy0923 的回复:
java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别
只有在调用了start方法后,线程才进入可运行状态(此时不一定会运行),当cpu时间片到的时候才会自动调用run方法,代码中无需调用run方法

就是这样的

#13


bang mang ding ding ,xiexie 

#14


接口可以实现多继承

#15


引用 10 楼 onlyonelove 的回复:
谢谢楼上各位的回答阿
我想知道:
继承Thread方法的线程t,需要手工t.start来启动该线程
实现了Runnable方法的线程tt,也需要手工tt.start来启动吗?


1.直接继承时:
Thread t = new Thread(); 
t.start(); //使线程进入就绪状态,等待CPU时间片
2.在使用Runnable的时候需要先new一个实现Runnable的实例,然后调用Thread构造函数。 
A impelements Runnable 
A a= new A(); 
Thread tt= new Thread(a);
tt.start(); //使线程进入就绪状态,等待CPU时间片

#16


实现方法不同

#17


实现功能都一样,但是runnable是面向接口,扩展性等方面比extends Thread好,简单的说因为Java是单继承,如果你一个类,需要实现线程,又要继承一个类,显然,使用Thread是不行的。建议使用Runnable面向接口的!

#18


1.A impelements Runnable  
A a= new A();  
Thread xx= new Thread(a);
Thread yy= new Thread(a);
xx.start();
yy.start(); 

2. A impelements Runnable  
A a= new A(); 
A a1= new A(); 
Thread xx= new Thread(a);
Thread yy= new Thread(a1);
xx.start();
yy.start();
请问什么时候适用第一种情况,什么时候适用第2种情况?