2016-07-07 63 views
-5

我試圖學習多線程是如何工作的。這是示例代碼,我有:Java - 實現Runnable行爲與擴展線程相比

public class Processor extends Thread { 
    private boolean running = true; 

    public void run() { 
     while (running) { 
      System.out.println("Hello there!"); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void shutDown() { 
     running = false; 
    } 

} 

public class ProcessorDemo { 
    public static void main(String[] args) { 

     Processor proc1 = new Processor(); 
     proc1.start(); 

     System.out.println("Press return to stop"); 
     Scanner sc = new Scanner(System.in); 
     sc.nextLine(); 
     proc1.shutDown(); 

    } 

} 

出現的問題,當我實現Runnable,而不是擴展Thread - 代碼差異

public class Processor implements Runnable 

// in ProcessorDemo 
Thread proc1 = new Thread(new Processor()); 

會發生什麼,代碼給出一個錯誤,說: 「方法shutDown()是未定義的類型線程」

爲什麼會發生這種情況,創建線程的兩種方式都應該給出相同的結果?

謝謝大家:)

+0

這是一個高度環境/語言特定的問題。請在您的問題中包含這些信息。最好在標籤中。 – Aron

+0

_「創建線程的兩種方式應該給出相同的結果」_ - 這是不正確的。你爲什麼認爲這是真的? –

+0

你的意思是說你的第二個版本根本不編譯?這不完全是「行爲不同」,因爲你根本不會採取行動,因爲你永遠不會運行它。 – pvg

回答

0

在第一示例中,Processor類被定義爲具有一個方法shutdown。因此,在實例化Processor時,該方法存在。

在第二個例子中,shutdownProcessor類存在,而你試圖調用它Thread類。

在這個例子中,類Thread從未擴展,並且因此不具有像在第一示例中的擴展類ThreadProcessor)任何額外的功能。

0

在第一種情況下,您初始化「處理器」類型的引用。因爲,類處理器具有方法'shutDown()'。 JVM可以在類處理器中找到該方法。 Processor proc1 = new Processor();

第二種情況,'處理器實現可運行'。你使用'Thread'類型初始化了對象'proc1'。 Wheare類型'線程'沒有方法'關閉'。這就是爲什麼在試圖調用'proc1.shutDown()'的時候,你得到的錯誤是'方法未定義' - >這實際上意味着,方法'關閉' ()」不可用在類‘線程’中第二個例子

Processor proc1 = new Processor(); 
Thread proc1 = new Thread(proc1); 
proc1.shutDown(); 
+0

那麼如何在實施時使用它? – Rio

+0

在回答中添加了代碼。替換你的主要方法中的設置。它會工作 –

0

問題: 記住你正在使用Thread實例調用方法shutDown()它實際上存在於您的Processor類。

但是這不是你的第一個例子。您使用Processor實例調用shutDown(),這是合法的。

1

您的代碼不會編譯,因爲java.lang.Thread類沒有在其上定義的shutDown()方法;這是您在Processor類中定義的一種方法。

請仔細看一下在普通java.lang.Threadhttps://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html上有哪些方法可用。如果你想停止一個線程,我會建議看着.interrupt().join(),這取決於你的特定需求。

的如何使用.interrupt()一個例子:

import java.util.Scanner; 

public class Main { 
    public static void main(String[] args) { 

     Thread proc1 = new Thread(new Processor()); 
     proc1.start(); 

     System.out.println("Press return to stop"); 
     Scanner sc = new Scanner(System.in); 
     sc.nextLine(); 
     proc1.interrupt(); 

    } 
} 

class Processor implements Runnable { 
    public void run() { 
     while (! Thread.interrupted()) { 
      System.out.println("Hello there!"); 
     } 
    } 
} 

我通常執行Runnable接口而不是子類Thread自己,但你必須考慮哪一個更有意義爲您的使用情況。

相關問題