我有以下代码
包裹测试;
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();
}
}
在这段代码中,我期待最后一个线程将覆盖消息字符串,并且所有线程都应该开始打印相同的消息(最后初始化),但是当我运行代码时,似乎每个线程都为自己的消息保留值变量并打印出来。我的理解在这里错了吗?
答案 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);