为什么要为Threads创建一个匿名的Runnable子类?

时间:2015-07-26 16:32:57

标签: java multithreading coding-style

使用Threads时,写下这样的东西是很常见的:

Runnable r = new Runnable()
{
    public void run() { /* ... */ }
};
new Thread(r).start();

这一切都很好而且正确,但我相信可以通过更加高效和简单的方式实现同​​样的目标:

new Thread()
{
    public void run() { /* ... */ }
}.start();

但是,在使用ThreadsRunnable的代码示例中,我几乎从未见过这样的内容。是否有任何技术或样式相关的原因使用第一个例子而不是第二个例子?

2 个答案:

答案 0 :(得分:2)

Becoz:)

Runnable r = new Runnable()
{
    public void run() { /*your code */ }
};
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();

等于

new Thread()
{
    public void run() { /* ... */ }
}.start()
new Thread()
{
    public void run() { /* ... */ }
}.start();

new Thread()
{
    public void run() { /* ... */ }
}.start();
new Thread()
{
    public void run() { /* ... */ }
}.start();
  

它们并不完全相同。在第一种情况下,所有线程在第二种情况下共享相同的runnable,它们不会。在第一种情况下,写入易失性字段(或者如果发生之前存在),将对其他线程可见。

答案 1 :(得分:1)

基本上Threadextends也是Runnable接口,所以Thread类的行为也可以通过实现Runnable接口直接扩展来实现Thread类并实施run方法。 此外,您还可以扩展其他类,并实现更多interface