m0_63504990 2023-07-01 22:23 采纳率: 100%
浏览 17
已结题

java多线程run()方法的问题

这里每一次线程抢占到CPU都运行run()方法,run方法new了一个ArrayList对象,按道理说每一次新new一个对象都会在堆里面新建一个,为什么到最后这些值都加到了同一个ArrayList对象啊。

 public void run() {
        ArrayList<Integer> boxList = new ArrayList<>();
        //1.循环
        //2.同步代码块
        //3.判断(共享数据到末尾)
        //4.判断(共享数据没有到末尾)
        while(true){
            synchronized (Thread.class){
                    Collections.shuffle(list);
                    int prize = list.remove(0);
                    boxList.add(prize);
                }
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

  • 写回答

2条回答 默认 最新

  • 草履虫· 2023-07-03 11:11
    关注

    并不是每次线程抢占到CPU都从run()方法的第一行开始执行的,而是从哪里停止接着往下执行。
    例如这里Thread.sleep(500)让出CPU的执行权,等到下一次调度获得CPU后就从Thread.sleep(500)的下一行开始执行,即while语句,所以从始至终就只new了一个ArrayList对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月11日
  • 已采纳回答 7月3日
  • 修改了问题 7月1日
  • 创建了问题 7月1日

悬赏问题

  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web
  • ¥30 AD9854 为什么输出波形幅度受限,AI机器人勿扰
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework
  • ¥15 如何联系真正的开发者而非公司