新实例未终止Thread

时间:2016-01-25 09:49:30

标签: java multithreading

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

我的理解(来自此链接difference between processes and threads)线程是进程的子集,进程中的所有线程共享相同的堆,内存等。现在,如果'private boolean running'变量在所有进程之间共享线程(因为它是一个类变量)然后为什么新的Processor实例没有新的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!!


    }

}

3 个答案:

答案 0 :(得分:1)

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

PS请在尝试使用之前学习Java。它是使用这种语言的语言和编程的基础。

答案 1 :(得分:0)

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!!


    }

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

答案 2 :(得分:0)

使用new Processor()创建类的新实例时,它会获得自己的&#34;空格&#34;对于变量。这与Threads无关,它只是面向对象。一个类的每个实例都有自己的变量。