我不确定我应该对这个问题给出什么标题。基本上我的问题是ints自己的实例类中的线程共享变量:例如,请检查下面的代码:
public class MainJava {
public static void main(String[] args) throws InterruptedException {
MyThread obje1=new MyThread(25);
MyThread obje2=new MyThread(50);
Thread t1=new Thread(obje1);
t1.setName("Thread"+25);
t1.start();
Thread.sleep(2000);
Thread t2=new Thread(obje2);
t2.setName("Thread"+50);
t2.start();
}
}
class MyThread implements Runnable {
int i;
String threadName;
public MyThread(int i) {
this.i = i;
}
@Override
public void run() {
if (Thread.currentThread().getName().equals("Thread25")) {
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(i +" FOR THREAD : "+Thread.currentThread().getName());
}
}
在这个帖子中,我的假设是Thread50会将i的值覆盖为50,然后Thread25将读取i的值为50.因为我是实例变量,它将在两个线程之间共享。但输出为50 FOR THREAD:Thread50 25 FOR THREAD:Thread25 所以我对这个外出感到困惑。有人可以帮助我理解这一点。提前致谢
答案 0 :(得分:0)
MyThread obje1 = new MyThread(25);和MyThread obje2 = new MyThread(50);是两个独立的实例,你正在做的是创建两个线程,彼此独立地执行run方法。所以没有什么可分享的。
此示例中的不同之处在于您创建的两个Thread类是否使用相同的MyThread实例。在这种情况下,是的,第二个线程将更改其他线程的值
答案 1 :(得分:0)
"实例变量"表示类的每个实例都有自己的变量副本。如果您想要由类†的所有实例共享的单个变量,则将变量声明为static
。
†有一天,你会了解为什么static
变量是一种糟糕的软件设计方法,但今天却不行。