从外部获取线程变量的值

时间:2012-03-04 01:53:06

标签: java multithreading

假设我有一个像这样运行的线程:

private boolean working = true;

@Override public void run() {
   working = true;
   // do something
   working = false;
   ....
}

在我的主要话题中,我不断推出使用

的状态
while(threadClassObject.isWorking()) {
    System.out.println(threadClassObject.isWorking());
}
这会有用吗?我试过这个例子,它似乎工作。但有没有办法可以崩溃?例如如果线程正在进行更改工作,而mainThread尝试读取它的同时发生了什么?

4 个答案:

答案 0 :(得分:6)

问题的答案是它可能正在运行,但上面的代码是一个有风险的代码,并且可以在任何一天打破。尝试制作working volatile之类的

private volatile boolean working = true;

What e.g. happens if the thread is in the process of changing working while at the exact same time the mainThread tries to read it?

分配操作是原子操作。因此,如果您有单个cpu,则两个线程在访问变量时永远不会发生冲突。如果您有多个cpu,则两个线程在访问变量时可能会发生冲突。对于这两种情况,volatile将确保该值对其他线程可见。

注意:volatile适合您的情况,但如果您有更复杂的数据要跨线程try looking into this分享

编辑:

添加评论也是soln的一部分。使其更清晰。

基本上在cpu级别进行优化的bcoz,值改变了我的一个线程可能对另一个线程不可见。一个很好的例子是cpu cache bcoz optimization,这些值永远不会反映在另一个线程可能正在读取的ram中。 Volatile告诉我这个变量的值可以在当前线程的范围之外更改,因此不会进行这样的优化...

答案 1 :(得分:3)

您可能还希望在主线程中使用“失控”循环执行某些操作:

当前的实现将继续旋转,不会为执行run()的线程(或系统中的任何其他人)留下太多的CPU时间。

答案 2 :(得分:1)

您需要使用同步或AtomicBoolean才能使其成为线程安全的。您的代码中的内容似乎有效,但是当您检查布尔值时,它可能不是正确的值,因此您将看到意外的结果。

答案 3 :(得分:0)

不,没有必要像布尔一样锁定原始类型。如果'working'是一个对象,那么您需要使用 synchronized 块。