【问题标题】:New instance not terminating Thread新实例未终止线程
【发布时间】:2016-01-25 09:49:30
【问题描述】:

在下面的代码中,为什么使用新实例调用shutDown() 方法不会停止while 循环,但是当我使用Processor 类的现有实例调用shutDown() 方法时,循环会终止?

我的理解(来自此链接difference between processes and threads)线程是进程的子集,进程中的所有线程共享相同的堆、内存等。现在,如果所有线程之间共享“私有布尔运行”变量(既然它是一个类变量)那么为什么不新的处理器实例new Processor().shutDown(),将所述变量更改为false?

import java.util.Scanner;

class Processor extends Thread {
    private  boolean running = true;

    public void run() {
        while(running) {
            System.out.println(" hello ppl");
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void shutDown() {
        running = false;

    }
}


public class App1 {
    public static void main(String[] args) {
        Processor p1 = new Processor();
        p1.start();

        System.out.println("press enter to stop");
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();


        p1.shutDown(); // THIS WORKS
        //new Processor().shutDown(); // THIS DOESNT!!


    }

}

【问题讨论】:

  • 您的错误在于private boolean running 变量——它是一个类实例字段(Processor 的每个实例都有自己的)而不是一个类字段(所有实例共享同一个)。要按照您的意图使用类字段,您必须声明它static。但是,您必须同步对共享空间的访问。

标签: java multithreading


【解决方案1】:

您尝试更改实例变量。每个实例都有自己的一组变量。在您的情况下,您应该使用带有修饰符 static 的类变量 - 然后在 .shotDown() 调用之后,您的所有线程都将关闭。

PS 请先学习 Java,然后再尝试使用它。它是语言和使用该语言编程的基础知识。

【讨论】:

  • 哦。谢谢。我忘记添加静态关键字了。
【解决方案2】:
new Processor().shutdown(); 

因为威胁从哪里开始而无法工作?

要运行一个线程,首先需要启动它。上面的代码正在创建一个新线程,但没有启动它!

像这样修改它,

Processor p = new Processor();
p.start();
p.shutdown();

像上面那样尝试..它会工作。

如果您希望停止同一线程,请分配全局运行的布尔值,或使其成为静态,如下所示..

import java.util.Scanner;

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

    public void run() {
        while(running) {
            System.out.println(" hello ppl");
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void shutDown() {
        running = false;

    }
}


public class App1 {
    public static void main(String[] args) {
        Processor p1 = new Processor();
        p1.start();

        System.out.println("press enter to stop");
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();


        //p1.shutDown(); // THIS WORKS
        new Processor().shutDown(); // THIS WILL WORK NOW!!


    }

但这将停止正在运行的线程的所有实例。好的做法是前者!您的解决方案是后者!

【讨论】:

  • 谢谢。不添加 static 关键字是一个小错误。感谢您的耐心等待
  • 如果我的解决方案对您有帮助,请标记答案。欢迎!
【解决方案3】:

当您使用new Processor() 创建类的新实例时,它会获得自己的变量“空间”。这与线程无关,它只是面向对象的。类的每个实例都有自己的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多