Main.java
public class Main {
public static void main(String[] args) {
Service ser=new Service();
ThreadA a=new ThreadA(ser);
a.start();
ser.stopMethod();
}
}
ThreadA.java
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service)
{
this.service=service;
}
@Override
public void run() {
service.runMethod();
}
}
Service.java
public class Service {
private boolean isContinueRun=true;
public void runMethod()
{
while(isContinueRun)
{
}
System.out.println("停下来了");
}
public void stopMethod()
{
isContinueRun=false;
}
}
按照书上说的 不是共享变量在多线程中是单独的副本吗 ser已经传入到ThreadA中 我在主线程中改变了状态值会影响到线程中的副本吗? 这段代码执行后 确实把循环停住了
求大神们帮忙看看
首先,java的对象是存储在堆内存中的,是所有线程共享的。
其次,你说的线程中使用副本是ThreadLocal类型的成员变量,在每个线程中是副本。
因为堆内存中的对象是所有线程共享的,所以可以通过对象进行线程间通信,就是你给的例子,通过外界主线程控制对象的状态,来通知子线程结束执行。另外涉及到多线程访问相同对象时,需要注意线程同步,才能保证对象状态的一致性。
你传的是一个对象又不是地址,ser肯定不会 对thread的有影响的
变量的共享一般声明为ThreadLocal类型,你通过set方法改变了标记,所以runMethod跳出来,所以线程可以执行完毕,正常结束,并不是停止。
上面说的有问题吧,你在a.start后面加上Thread.sleep(2000);再试试看,threada就会死循环。