在下面的代码中,为什么使用新实例调用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!!
}
}
答案 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无关,它只是面向对象。一个类的每个实例都有自己的变量。