Java 线程如何在ints自身实例类中共享变量
我不知道该给这个问题起什么标题。基本上,我的问题是ints自身实例类中线程如何共享变量:例如,请检查以下代码:Java 线程如何在ints自身实例类中共享变量,java,multithreading,Java,Multithreading,我不知道该给这个问题起什么标题。基本上,我的问题是ints自身实例类中线程如何共享变量:例如,请检查以下代码: public class MainJava { public static void main(String[] args) throws InterruptedException { MyThread obje1=new MyThread(25); MyThread obje2=new MyThread(50); Thread
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。因为i是实例变量,它将在两个线程之间共享。但线程的输出是50:Thread50
25螺纹:螺纹25
所以我对这件事感到困惑。有人能帮我理解这一点吗。提前感谢MyThread obje1=新的MyThread(25);MyThread obje2=新的MyThread(50);如果是两个单独的实例,您要做的是创建两个线程,分别独立地执行run方法。所以没有什么可分享的 本例中的不同之处在于,您创建的两个线程类使用的是同一个MyThread实例。在这种情况下,是的,第二个线程将更改另一个线程的值。“实例变量”意味着类的每个实例都有自己的变量副本。如果希望类†的所有实例共享一个变量,则将该变量声明为
静态
†有朝一日,您将了解为什么
静态
变量是软件设计的一种糟糕方法,但不是今天。使用静态int i
?了解静态。它是class
级别而不是实例级别。i
与类的单个实例相关,所以Thread50
和Thread25
都有自己的副本,不受其他副本的影响…@CycDemo我为什么要使用static int。我不想在线程之间共享它。@MadProgrammer发布问题后,我意识到了这一点,因为两个线程是分开的线程对象。但是假设我将userdefinedclassobjectobje替换为int i。然后我需要处理分享的问题,对吗?检查这里