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