2015-11-16 101 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()的方法(靜態)。

如果這個方法也不是一成不變的,它會自動覆蓋的實施和隱藏父類的方法實例..

那麼,是不是錯誤。簡單的!

相關問題