当前位置: 首页 > 知识库问答 >
问题:

我正在尝试运行其run()方法具有for循环的线程,只有在使用睡眠()时才会跳过一些循环。有人能解释一下为什么吗?

冯鸿哲
2023-03-14

我试图运行四个线程。run()方法有一个循环10次的for循环。在每个循环中,共享资源“x”递增1。当所有线程都死时,for循环应该运行4x10=40次,x值应该等于40。

这并不是在我的所有代码运行中都会发生的。每次我运行代码时,它都会打印不同的x值。x的大多数输出值都在33到40之间。

为什么不是每次都是40?这是否意味着跳过了一些for循环?是否由于被阻止而导致?

注意:这不会发生在睡眠()被删除时。它每次打印40个。

我的代码:

    public class MyThreadImplementsRunnable implements Runnable{

        int x =0;

        public void run() {

            for(int i=0;i<10;i++){
            x = x+1;

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {

                System.out.println("exception");
                e.printStackTrace();
            }
            }
        }



        public static void main(String[] args) {

            MyThreadImplementsRunnable m = new MyThreadImplementsRunnable();
            Thread t1 = new Thread(m,"first");
            Thread t2= new Thread(m,"second");
            Thread t3= new Thread(m,"third");
            Thread t4= new Thread(m,"fourth");
            t1.start();
            t2.start();
            t3.start();
            t4.start();

            //To make sure not to go the next statement unless all threads die
            while(t1.isAlive()|| t2.isAlive()|| t3.isAlive()||t4.isAlive()){
            }

            //After all threads die
            System.out.println("now all threads are dead");
            //value of the shared resource x after all threads exit
            System.out.println(m.x);



        }

}

一些测试运行得出以下结果:

    Output:
    now all threads are dead
    34
    Output:
    now all threads are dead
    33

共有2个答案

凤自珍
2023-03-14

您正在线程之间使用共享资源(x),这必然会产生许多问题,如数据竞争、可见性。。你的答案总是不同的

@oleg我不认为挥发性在这种情况下会有帮助

薛栋
2023-03-14

x=x 1从内存中加载x的值,将1添加到该值中,然后将其存储在x中。假设线程t1加载30,同时线程t2加载30,它们都将30增加1,并将31存储在x中,而不是32。

为什么总是40岁没有睡眠可能是由许多事情引起的,我假设这是由每个线程运行得非常快并在下一个线程开始之前完成引起的。

您也不使用易失性并且存在可见性问题,但现在我们不要讨论这个问题。如果您想编写多线程代码,这也是您需要学习的内容。

 类似资料:
  • 很多次我看到在一些示例解决方案中,如果它说每秒停止线程,创建者在run方法中做了这样的事情: 所以在一个无限执行的while循环中。否则,我也看到了这一点: 为什么有时他们把睡眠方法放在一个循环中,而有时不放在一个循环中? 在一些解决方案中,代码的创建者将睡眠放在循环中,然后我删除了循环,代码停止工作。在其他不在循环中的情况下,我将其放入循环中,代码会导致错误。。。。为什么? 我怎么知道什么时候必

  • 我想写一个计算长除法问题总进位的代码。这是我为carries编写的函数。我相信问题在于,第一个while循环并没有一直运行。如果是,为什么?这是在Python 3.5中实现的。

  • 我对python中双for循环的使用感到困惑,这是我的代码: 输出如下: 它只对外循环的第一个值执行内循环,为什么会发生这种情况?我怎样才能让它在第一个和第二个变量的所有组合上循环?

  • 我想我的程序跳过了while循环,但我真的不确定到底发生了什么。该函数应该通过找到GCD,然后将分子和分母除以该数字来减少分数。 我得到分子和分母的绝对值,以确保如果分数是负数,我会在最后保持它。如果分子为0,则要求我返回(0,1)。问题是关于while循环。。。似乎它被完全跳过了。有什么建议吗?

  • 我一直在读一本面向初学者的书,“第一头HTML5编程”,其中有这样一段代码: 目前,如果我调用,它将返回下一次显示是在下午5:00。我将循环条件更改为“I<=movie.showtimes.length;”但它仍然只运行一次,并且只显示下午5点。循环只迭代一次,即使我重写了这个函数: 不是应该跑两次吗?

  • 问题内容: 这段代码: 使我的计算机挂起5秒钟,然后打印出0-9,而不是每半秒打印一次数字。难道我做错了什么? 问题答案: ,默认情况下,在内部打印到并缓冲要打印的输出。 通常是否由文件确定输出是否被缓冲,但是如果关键字参数为true,则将强制刷新流。 在版本3.3中更改:添加了关键字参数。 报价文件, 交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。 因此,就您而言,您需要像这