繁体   English   中英

从外部获取线程变量的值

[英]Getting value of a thread variable from outside

可以说我有一个像这样运行的线程:

private boolean working = true;

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

在我的主线程中,我不断推出与之合作的状态

while(threadClassObject.isWorking()) {
    System.out.println(threadClassObject.isWorking());
}

这会有用吗? 我试过这个例子,它似乎工作。 但有没有办法可以崩溃? 如果线程正在改变工作的过程中,例如在mainThread尝试读取它的同时发生了什么?

您的问题的答案是它可能正在工作,但上面的代码是一个有风险的代码,可以在任何一天打破。 试着做working volatile

private volatile boolean working = true;

What eg 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在你的情况下是好的,但如果你有更复杂的数据要跨线程共享,请尝试查看

编辑:

添加评论也是soln的一部分。 使它更清楚。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM