BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #45887同步于 2015/11/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[疑惑]创建线程的两种方法有何异同?

CJ752431179
2015/11/28镜像同步9 回复
扩展Thread类或者实现Runnable接口,两种方法所创建的线程,在内存分配上有何异同? 是否都是共享方法区和heap,而独享虚拟机栈和程序寄存器? 为什么推荐后者而不推荐前者,看书上写的原因是开销太大,不太理解,求教各位了。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
aiquestion机器人#1 · 2015/11/28
Thread类的start会真正系统调用去创建一个线程。 Runnable只是一个接口,貌似就只有一个run()的方法吧。 实现Runnable并不会创建线程,如果想要执行实现Runnable的类的调用的话,虚要把它放到一个线程里去,比如放倒Thread里去。或者更推荐的方法应该是使用Java的线程池来执行这个Runnable。线程池可以实现线程的复用,比如一个线程刚执行完了Runnable1,发现还有一个任务,于是就不销毁自己,而是直接去执行了Runnable2. 而且自己创建Thread有可能玩的太high成了野线程。。。比如创建了之后没有引用了,就不知道怎么停下来了。。 【 在 CJ752431179 的大作中提到: 】 : 扩展Thread类或者实现Runnable接口,两种方法所创建的线程,在内存分配上有何异同? : 是否都是共享方法区和heap,而独享虚拟机栈和程序寄存器? : 为什么推荐后者而不推荐前者,看书上写的原因是开销太大,不太理解,求教各位了。
nuanyangyang机器人#2 · 2015/11/29
倒不是开销问题。我觉得是,你定义一个作业的时候,并不在意它是不是一定在一个新线程里运行。如果用runnable,那么你有很大的选择余地。想在新线程里执行它,就创建Thread,想在当前线程里运行,就直接调用run(),还可以用Executor,比如ThreadPoolExecutor。但是如果一开始就继承了Thread,就只能在新线程里跑了。
vampire24机器人#3 · 2015/11/29
thread类本身就实现了Runnable接口。我觉得用Runnable更灵活一点而已,毕竟JAVA只支持单继承。
CJ752431179机器人#4 · 2015/11/29
嗯,明白了,多谢……[ema11][ema11] 【 在 aiquestion 的大作中提到: 】 : Thread类的start会真正系统调用去创建一个线程。 : Runnable只是一个接口,貌似就只有一个run()的方法吧。 : 实现Runnable并不会创建线程,如果想要执行实现Runnable的类的调用的话,虚要把它放到一个线程里去,比如放倒Thread里去。或者更推荐的方法应该是使用Java的线程池来执行这个Runnable。线程池可以实现线程的复用,比如一个线程刚执行完了Runnable1,发现还有一个任务,于是就不销毁自己,而是直接去执行了Runnable2. : ...................
CJ752431179机器人#5 · 2015/11/29
受教了,多谢暖神[ema9] 【 在 nuanyangyang 的大作中提到: 】 : 倒不是开销问题。我觉得是,你定义一个作业的时候,并不在意它是不是一定在一个新线程里运行。如果用runnable,那么你有很大的选择余地。想在新线程里执行它,就创建Thread,想在当前线程里运行,就直接调用run(),还可以用Executor,比如ThreadPoolExecutor。但是如果一开始就继承了Thread,就只能在新线程里跑了。
CJ752431179机器人#6 · 2015/11/29
恩啊,看到你和暖神之后讲的明白了,runnable可以更灵活控制,而直接继承Thread就只能在当前线程里运行了。 【 在 vampire24 的大作中提到: 】 : thread类本身就实现了Runnable接口。我觉得用Runnable更灵活一点而已,毕竟JAVA只支持单继承。
nuanyangyang机器人#7 · 2015/11/29
【 在 CJ752431179 的大作中提到: 】 : 恩啊,看到你和暖神之后讲的明白了,runnable可以更灵活控制,而直接继承Thread就只能在当前线程里运行了。 是只能在另一个线程里运行了。
cowfighting机器人#8 · 2015/11/29
java是单继承 实现接口扩展性更强
CJ752431179机器人#9 · 2015/11/29
哦哦哦,谢谢指出这个错误 【 在 nuanyangyang 的大作中提到: 】 : : 是只能在另一个线程里运行了。