当前位置: 首页 > 面试题库 >

Java线程计数不起作用

巴帅
2023-03-14
问题内容

为什么计数为0?

我先启动线程1,然后再启动线程2。计数应为2000。但是它显示计数为0。请有人用简单的术语进行解释。

public class App {
    private int count = 0;

    public static void main(String[] args) {
        App app = new App();
        app.doWork();
    }

    public void doWork(){
        Thread t1 = new Thread(new Runnable(){
            public void run(){
                for(int i = 0;i < 10000;i++){
                    count++;
                }
            }
        });

        Thread t2 = new Thread(new Runnable(){
            public void run(){
                for(int i = 0;i < 10000;i++){
                    count++;
                }
            }
        });
        t1.start();
        t2.start();

        System.out.println("Count is: " + count);
    }
}

问题答案:

在打印线程计数时,线程尚未完成执行。

为了演示,Thread.sleep()在打印出线程数之前添加一条指令:

public class App {
    private int count = 0;

    public static void main(String[] args) throws InterruptedException {
        App app = new App();
        app.doWork();
    }

    public void doWork() throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    count++;
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    count++;
                }
            }
        });

        t1.start();
        t2.start();

        Thread.sleep(5000);

        System.out.println("Count is: " + count); // Count is: 20000
    }
}

还要注意,对基元的操作不是线程安全的,并且该count++操作也不是原子的。您应该同步访问count变量,或使用AtomicIntegerLongAdder代替int。就目前而言,最终的计数可能在零到20,000之间。



 类似资料:
  • 问题内容: 我从一个非常简单的多线程示例开始。我试图做一个线程安全的计数器。我想创建两个线程,使计数器间歇地增加到1000。以下代码: 据我所知,while循环现在意味着只有第一个线程才能访问计数器,直到达到1000。输出: 我该如何解决?如何获得共享计数器的线程? 问题答案: 两个线程都可以访问您的变量。 您看到的现象称为线程饥饿。输入代码的受保护部分后(很抱歉,我之前错过了它),其他线程将需要

  • 问题内容: 我正在用Java编写电台代码,并且正在使用一个线程来当然播放流。我在线程的run方法中有一个while循环,该循环检查名为ShouldPlay的变量是否为true,以及是否运行该变量。播放器。然后,我有一个pause()方法,将变量设置为false,并且自然希望它在变量为false时不运行播放器。我创建了一个小示例,说明如何在下面进行设置: 我想发生的事情是,当线程首次运行时,它应该打

  • 问题内容: 当我运行TaskJob时,我得到了空指针异常,因为Spring不会自动装配serviceJob服务。是新线程导致此问题,因为Spring自动连接mysqlService没有任何问题? 我的applicationContext.xml; 我的课是; 编辑: TaskJob实例化; 问题答案: Spring仅自动装配其创建的组件。您正在调用新的TaskJob(),Spring不知道该对象,

  • 我创建了将数据传递给spring rest的代码,但这些代码不能正常工作请参见下面的代码: 我的javascrit有:

  • 我有一个半完美的代码,但它没有更新字段:3R利润公式:,目标销售价格:,总目标利润:,目标收益:,其实它在更新字段,但我仍然需要使用TAB按钮,并在填充更改之前转到某些字段,但我希望它在我更改相关字段后立即自动更新。。。 它应该做的是自动更新文件3R利润公式:,目标销售价格:,总目标利润:,目标收益:,但似乎不能让它工作... 下面是我使用的公式,让我们现在只关注一个领域:3R利润公式 首先我们需

  • 问题内容: 我有一个复杂的功能(优化),它有可能进入循环或仅花费太多时间,而允许的时间由用户设置。 因此,我试图使函数在单独的线程中运行,并在经过最大时间后停止运行。我使用与以下代码相似的代码,但是它不起作用,因此 我认为我没有正确使用函数“ join”,或者它没有做我所了解的。任何想法? 谢谢! 感谢您的回答,目前我在这里找到了一个更好的主意*。它可以工作,但仍使用不建议使用的“停止”功能。新的