2015-11-16 60 views
0

是新的多线程编程,当我宣布run()方法为静态的给编译器错误的为什么不能在多线程中使用run()方法?

“这种静态方法不能隐藏线程的实例方法”。

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

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(); 

    } 
} 
+2

'run()'不是*静态*方法。它是'Runnable'接口中声明的方法,然后由'Thread'实现。 – TheLostMind

回答

0

因为java是面向对象的语言,任何东西都是java对象。 您尝试在多个线程中执行的任务也是对象,您应该创建此对象。当创建对象时,应该调用start()在Thread类上定义的方法。因此要实现自己的逻辑,您应该通过在Hello子类中实现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(); 
    } 
} 
2
public void run(); 

是CLA声明的方法ss Thread。因为它在Thread中不是静态的,所以你不能在你的子类中“改变”它为一个静态方法。举个例子,你甚至不需要那样做。

如果你需要有线程publicstatic和​​内执行的代码,我建议重构的那部分:

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

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

它不一定相应和对多线程编程,它一般来说Java是真实的。如果你有一个类:

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

不能然后在骑它,使之静:

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

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

0

thread Classrun方法,因此,如果您在hello class那么你要重写一遍定义它,(直接继承自Hello extends Thread)现在,它是没有意义把一个物件方法给一个类的方法,(运行方法是属于一个对象,而不是类),这就是为什么你的编译器与消息抱怨的原因:

“......你不能这样静态方法不能隐藏线程的实例方法 ”。

换句话说,您违反了它的继承规则。

1

在main()方法中,你创建了Thread-t1和t2的两个实例,然后你在它们上调用start(),这是正确的,你不能运行/启动类,而是一个实例。这就是run()方法不应该是静态的原因。它需要一个对象(一个Thread对象)来执行。只需从您的声明中删除静态,它将几乎没有问题。其他的事情是,你不需要让你的run方法同步(它是反生产的 - 你使用线程来执行paralel和ynchronize只在特定的部分永远不会整个运行方法)。

1

实例方法的run()是在招呼类已经上市,由于继承。您正试图创建另一个名为run()的方法(静态)。

如果这个方法也不是一成不变的,它会自动覆盖的实施和隐藏父类的方法实例..

那么,是不是错误。简单的!

相关问题