代码范例3.1:
结果:
首先,MyThread继承自Thread,并且覆盖了start()方法,所以,当其实例Thread时,不会再执行run()方法中的代码。其实这也是个 “没用的线程了”。
所以先打印:MyThread:start()。
其次,MyRunnable实现了Runnable接口,Runnable接口就一个run()方法。Thread thread=new Thread(myRunnable);这句代码,根据Runnable的实例创建了一个Thread实例,该Thread实例的start方法会执行run()方法中的代码。
所以又打印:MyRunnable:run()。
Thread与Runnable的区别如下。(www.xing528.com)
简单地说,由于Java是单继承的,因此实现Runnable接口更灵活。
稍微复杂点的情况是:Runnable接口只有一个方法,那就是run(),但是如果想对它做一些Thread对象才能做的事情(比如toString()里面的getName()),就必须用Thread.currentThread()去获取其引用。Thread类有一个构造函数,可以用Runnable和线程的名字作参数。
如果对象是Runnable的,那么只说明它有run()方法。也就是说,不会因为它是Runnable的,就具备了线程的先天功能,这一点与Thread的派生类不同。所以,必须像例程那样,用Runnable对象去创建线程。把Runnable对象传给Thread的构造函数,创建一个独立的Thread对象。接着再调用那个线程的start(),由它进行初始化,然后线程的调度机制就能调用run()了。
Runnable接口的好处在于,所有内容都属于同一个类。也就是说,Runnable能创建基类和其他接口的混合类。如果要访问其他内容,直接访问即可,不用再一个一个地打交道。但是内部类也有这个功能,它也可以直接访问宿主类的成员。所以这个理由不足以说服放弃Thread的内部类而去使用Runnable的混合类。
Runnable的意思是,要用代码(也就是run()方法)来描述一个处理过程,而不是创建一个表示这个处理过程的对象。在如何理解线程方面,一直存在着争议。这取决于将线程看作是对象还是处理过程。如果认为它是一个处理过程,那么就摆脱了 “万物皆对象”的教条。但与此同时,如果只想让这个处理过程掌管程序的某一部分,那么就没有理由让整个类都成为Runnable的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。