2016-07-07 84 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自己,但你必须考虑哪一个更有意义为您的使用情况。

相关问题