首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解线程Java中的等待

理解线程Java中的等待
EN

Stack Overflow用户
提问于 2022-02-24 04:49:47
回答 2查看 1.3K关注 0票数 2

我有以下代码:-

代码语言:javascript
复制
class ThreadB extends Thread {
    int total;

    @Override public void run() {
        synchronized (this){
            for(int i=0; i<5; i++){
                total+=i;
            }
        }
    }
}

public class Solution {
    public static void main(String[] args) throws InterruptedException {
        ThreadB b = new ThreadB();
        b.start();
        synchronized (b){
            b.wait();
        }
        System.out.println(b.total);
    }
}

每当我运行它时,输出都是10。如果我注释等待行,则输出始终为0。

我很困惑为什么我总是得到10的答案。有两个线程,ThreadB和主线程,所以当我执行等待方法时,ThreadB应该按照定义等待,不应该添加值,因此0应该由主线程打印?

EN

Stack Overflow用户

发布于 2022-02-28 01:03:01

我很困惑为什么我总是得到10的答案。有两个线程,ThreadB和主线程,所以当我执行等待方法时,ThreadB应该按照定义等待,不应该添加值,因此0应该由主线程打印?

由于Java线程终止的方式,您得到了一个结果。当Thread完成时,会通知Thread对象本身。因此,wait()方法会导致线程等待后台线程的终止。join()方法是通过调用wait()实现的,您应该直接使用join()而不是wait()

如果对等待行进行注释,则输出始终为0。

如果您没有wait()行,那么主线程很可能会在b线程启动之前完成并得到b的值。启动线程需要一些时间,您需要使用b.join()来确保等待b线程完成,并与其他线程所做的任何内存更改同步,在本例中为b.total

如果您放置一个睡眠而不是等待,那么即使0线程已经将其设置为10,您仍然可能会看到它的值,因为没有同步内存的东西,并且可能缓存0的b.total值。join()方法等待线程完成并同步内存,以便您能够看到线程的结果。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71247244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档