Java - 与扩展线程

时间:2016-07-07 05:12:06

标签: java multithreading 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());

发生的是,代码发出错误,说: "对于Thread"

类型,未定义shutDown()方法

为什么会发生这种情况,当两种创建线程的方式应该给出相同的结果?

谢谢大家:)

4 个答案:

答案 0 :(得分:1)

您的代码无法编译,因为java.lang.Thread类没有定义shutDown()方法;这是您在Processor类上定义的方法。

仔细查看https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.htmljava.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从未扩展,因此在第一个示例中没有像扩展类ThreadProcessor)那样的任何其他功能。

答案 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()