我是多线程编程的新手,当我将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();
}
}
答案 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中不是静态的,因此无法将其“更改”为子类中的静态方法。根据你的例子,你甚至不需要这样做。
如果您需要在线程public
和static
以及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()方法来覆盖此行为。
尝试:
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;。