我试图了解多线程是如何工作的。这是我的示例代码:
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());
发生的是,代码发出错误,说: "对于Thread"
类型,未定义shutDown()方法为什么会发生这种情况,当两种创建线程的方式应该给出相同的结果?
谢谢大家:)
答案 0 :(得分:1)
您的代码无法编译,因为java.lang.Thread类没有定义shutDown()
方法;这是您在Processor
类上定义的方法。
仔细查看https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html处java.lang.Thread
处的普通.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
界面而不是子类化{{1}},但你必须考虑哪一个对你的用例更有意义。
答案 1 :(得分:0)
在第一个示例中,类Processor
被定义为具有方法shutdown
。因此,在实例化Processor
时,该方法存在。
在第二个示例中,shutdown
存在于类Processor
下,而您尝试在类Thread
上调用它。
在此示例中,类Thread
从未扩展,因此在第一个示例中没有像扩展类Thread
(Processor
)那样的任何其他功能。
答案 2 :(得分:0)
在第一种情况下,您使用“处理器”类型初始化了引用。因为,类处理器的方法是'shutDown()'。 JVM可以在类处理器中找到该方法。 处理器proc1 =新的Processor();
第二种情况,'处理器实现Runnable'。您使用“Thread”类型初始化了对象'proc1'。 “Thread”类型没有'Shutdown'方法。只有你的班级'处理器'的方法是'shutdown()'
这就是为什么在尝试调用'proc1.shutDown()'时,你会收到'方法未定义'的错误 - >这实际上意味着,方法'shutDown()'在类'Thread'中不可用
Processor proc1 = new Processor();
Thread proc1 = new Thread(proc1);
proc1.shutDown();
答案 3 :(得分:0)
第二个例子中的问题:
请记住,您正在使用Thread
实例来调用实际存在于shutDown()
类中的方法Processor
。
但您的第一个例子并非如此。您使用Processor
实例来调用合法的shutDown()
。