为什么run()方法在多线程中是静态的?

时间:2015-11-16 10:21:38

标签: java multithreading

我是多线程编程的新手,当我将run()方法声明为静态时,将编译器错误称为

  

"此静态方法无法隐藏Thread"。

中的实例方法

我不明白这意味着什么,所以请帮助我。

public class hello extends Thread {

    public static synchronized  void run() {
        for(int i=0;i<1000;i++)
            System.out.println(i);
    }

    public static void main(String[] args) {
        hello t1 = new hello();
        hello t2 = new hello();

        t1.start();
        t2.start();

    }
}

6 个答案:

答案 0 :(得分:7)

它不一定与多线程编程相关,一般来说它也适用于Java。如果你有一个班级:

public class MySuperclass {
  public void myMethod() {
    //do stuff
  }
}

不能然后覆盖它以使其静止:

public class MySubclass extends MySuperclass {
  public static void myMethod() {
    //do other stuff
  }
}

这是不允许的。 这就是错误信息的含义。

答案 1 :(得分:2)

public void run();

是在类Thread中声明的方法。由于它在Thread中不是静态的,因此无法将其“更改”为子类中的静态方法。根据你的例子,你甚至不需要这样做。

如果您需要在线程publicstatic以及synchronized内执行代码,我建议重构该部分:

@Override
public void run() {
  staticRun();
}

public static synchronized void staticRun() {
  for(int i=0;i<1000;i++)
        System.out.println(i);
}

答案 2 :(得分:1)

在main()方法中创建两个Thread - t1和t2实例,然后在它们上调用start(),这是正确的,你不能运行/启动类而是一个实例。这就是为什么run()方法不应该是静态的。它需要一个对象(一个Thread对象)来执行。只需从声明中删除静态,它几乎可以。另外一点是你不需要让你的run方法同步(这是适得其反的 - 你使用线程在paralel中执行,只在特定部分上使用ynchronize而不是整个run方法)。

答案 3 :(得分:1)

由于继承,实例方法 run()已在hello类中可用。您正在尝试创建另一个具有相同名称run()的方法(静态)。

如果方法不是静态的,它将自动覆盖实现并隐藏父类的方法实例。

所以,错误是......简单!

答案 4 :(得分:0)

因为java是面向对象语言而且java是对象。 您尝试在多个线程中执行的任务也是对象,您应该创建此对象。创建对象时,应调用在Thread类上定义的 start()方法。因此,要实现自己的逻辑,您应该通过在Hello子类中实现 run()方法来覆盖此行为。

  • Run方法定义应该在其他线程中执行的逻辑(注意,run方法不会创建新线程)
  • Start方法告诉java创建新的本机线程并在这个新线程中执行run方法

尝试:

public class Hello extends Thread{

    public void run()
    {
       for(int i=0;i<1000;i++)
       System.out.println(i);
    }
}

public class Main
{
    public static void main(String[] args)
    {
          Hello hello t1 = new hello();
          Hello hello t2 = new hello();
          t1.start();
          t2.start();
    }
}

答案 5 :(得分:0)

thread Class有一个run方法,因此,如果您在hello class中再次定义它,那么您现在覆盖它,(从Hello extends Thread开始直接继承),它将Object方法转换为Class方法没有意义,(run方法属于对象而不属于类),这就是编译器抱怨消息的原因:

  

&#34; ...你不能这种静态方法无法隐藏实例方法   来自Thread&#34;。

换句话说,你违反了继承规则。