如何在ints自己的实例类中共享变量

时间:2014-07-24 07:19:57

标签: 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 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 所以我对这个外出感到困惑。有人可以帮助我理解这一点。提前致谢

2 个答案:

答案 0 :(得分:0)

MyThread obje1 = new MyThread(25);和MyThread obje2 = new MyThread(50);是两个独立的实例,你正在做的是创建两个线程,彼此独立地执行run方法。所以没有什么可分享的。

此示例中的不同之处在于您创建的两个Thread类是否使用相同的MyThread实例。在这种情况下,是的,第二个线程将更改其他线程的值

答案 1 :(得分:0)

"实例变量"表示类的每个实例都有自己的变量副本。如果您想要由类†的所有实例共享的单个变量,则将变量声明为static


†有一天,你会了解为什么static变量是一种糟糕的软件设计方法,但今天却不行。