我只想知道以下两种调用线程的方法有什么区别。
请查看两个场景的两张图片
我的问题是我遇到的行为是当我遵循“情景1”时我失去了对我的程序的控制权和
MyClass中的“//其他命令”没有运行
当我按照方案二时,我的顺序很顺利。有没有人注意到这种行为或是故障?
请发表意见。
此致
答案 0 :(得分:0)
我想这不是实现Thread
(这不是已经说明的接口),而是实现Runnable
。
所以问题似乎是(这只是一个猜测,因为你的问题丢失了):谁应该开始主题 - MyClass
或MyThread
?
基本上,我更喜欢方案1,因为MyThread
实际上只是一个可运行的任务,不应该另外处理线程本身。
因此MyClass
应该创建并启动线程。这将允许您保留对生成的线程的引用,并可能稍后调用join()
或其他方法。
作为旁注,我将MyThread
更改为:public class MyRunnable implements Runnable { ... }
答案 1 :(得分:0)
您可能想要访问Thread对象,例如等待它完成或轮询它的状态。在方案2中,您可能不会这样做,因为无法从客户端代码访问变量t
。为了实现这一点,您必须从外部代码中看到t
或覆盖Thread
方法(这将是徒劳的)。如果invokeThread
是某种便利方法,您可以考虑返回t
。
如果方案2的意思是“MyThread
封装运行线程并控制它的状态”,则不必扩展Thread
(这看起来有点令人困惑)。
如the other comment中所述,我会先实施Runnable
,而不是将Thread
子类化为更清晰的代码。