import java.util.Scanner;
/*·
(1)在main方法中启动两个线程
(2)第1个线程循环随机打印100以内的整数
(3)直到第2个线程从键盘读取了“Q”命令。
*/
public class HomeWork01 {
public static void main(String[] args) throws InterruptedException {
A a = new A();
B b = new B();
a.start();
b.start();
}
}
class A extends Thread{
private boolean loop = true;
public void setLoop(boolean loop) {
this.loop = loop;
}
@Override
public void run() {
while (loop){
System.out.println((int)(Math.random()*(100-0)));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B extends Thread{
@Override
public void run() {
Scanner sca = new Scanner(System.in);
while (true){
System.out.println("输入Q结束:");
char end = sca.next().toUpperCase().charAt(0);
System.out.println("-----"+end);
if (end == 'Q'){
System.out.println("Q进来了----");
new A().setLoop(false);
System.out.println("循环退出");
break;
}
}
}
}
你在 main 函数里面创建了一个 A 线程的对象,并将其拉起执行。
然后,在输入Q之后的 B 线程中,又创建了一个 A 线程的对象。
前后创建的两个 A 线程对象,都是独立的内存对象,彼此之间没有任何关系。
setLoop(false) 这个值,不能从新创建的对象中传递到已经创建完的老的对象当中去,类和对象是具有封装属性的。
正确的方式,应该是:
另外,基于线程安全的考虑, boolean loop 最好加上 volatile 关键字。
main方法里new A得一个A对象(记作1),又在B线程的run里面new A得一个A对象(记作2)。
很明显,1和2是两个东西,没有关联。
楼上正解,new一个A,跟原来的A有什么关系,你只是改变了新new处理的A的值,原来的并没有变