实例变量生命在方法/线程内初始化

时间:2016-10-21 10:45:29

标签: java multithreading

我有以下代码

包裹测试;

public class TestRun implements Runnable {

    String message = new String("1111");

    public void run() {


        this.message="this is my message"+Thread.currentThread().getName();

        for(int i=0; i<10; i++)
        {
            try {
                Thread.sleep((new Double(Math.random()*10000 +1)).longValue());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        System.out.println(i +"this is message from thread"  + Thread.currentThread().getName() +" ====> " + message);
        }
    }

    public static void main(String args[]) throws InterruptedException {

        (new Thread(new TestRun())).start();
        Thread.sleep((new Double(Math.random()*10000 +1)).longValue());
        (new Thread(new TestRun())).start();
        Thread.sleep((new Double(Math.random()*10000 +1)).longValue());  
        (new Thread(new TestRun())).start();

    }
}

在这段代码中,我期待最后一个线程将覆盖消息字符串,并且所有线程都应该开始打印相同的消息(最后初始化),但是当我运行代码时,似乎每个线程都为自己的消息保留值变量并打印出来。我的理解在这里错了吗?

1 个答案:

答案 0 :(得分:0)

您创建了三个TestRun个对象,每个对象都有自己的字段。这是关于对象的基本概念,而不是像如何使用多个线程这样的更高级的主题。如果你想在线程之间共享数据,我建议使用线程安全的共享对象。 e.g。

AtomicReference<String> message = new AtomicReference<>();
new Thread(new TestRun(message))).start();
Thread.sleep(200);
new Thread(new TestRun(message))).start();
Thread.sleep(200);
new Thread(new TestRun(message))).start();

顺便说一下你应该只睡一个固定的数量,如Thread.sleep(100);