Java:陷入后台线程

时间:2016-05-31 20:23:43

标签: java multithreading logging libgdx

我正在使用LibGDX AsyncExecutor,并在后台线程中调用以下函数。 ' tasksForTheMainThread'是Runnable的静态数组,它在主线程中每次调用更新函数时执行其尚未执行的元素。功能' createBox' ' modelBuilder'创建并返回类的对象' Model'。

简要说明,此代码在第二个线程中执行,并发送一段代码(函数' run()')以在第一个线程中使用。发送完成后,第二个线程被冻结,直到代码进入" run()"完成并创建Model对象(或者至少它应该是这样的)。

但是,只有当while循环(等待直到在主线程中创建对象)包含记录位(Gdx.app.log("TAG","2");)时,它才能正常工作。当它空了,第二个线程永远冻结,永远不会到达A'甚至在创建Model对象之后。

日志记录为何以及如何影响这一点?为什么没有它的程序没有工作呢?

void secondThreadFunction()
{
    Model model = null;

    ChunkManager.tasksForTheMainThread.add(new Runnable()
    {
                    @Override
                    public void run()
                    {
                            model = modelBuilder.createBox(size.x, size.y, size.z, GL20.GL_LINES,
                                    new Material(ColorAttribute.createDiffuse(Color.YELLOW)),
                                    VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
                    }
     });

     while (model == null)
     {
            //Gdx.app.log("TAG","2");
     }

      //point A
}

1 个答案:

答案 0 :(得分:0)

您无法修改已捕获到内部类的局部变量。由于它已被捕获",您将操作该值的副本,它永远不会是非null,从而导致无限循环。另请注意,您正忙着等待紧急循环。使用某种Future可能更好。

void secondThreadFunction()
{
    AtomicReference<Model> model = new AtomicReference<Model>();

    ChunkManager.tasksForTheMainThread.add(new Runnable()
    {
                    @Override
                    public void run()
                    {
                            model.set(modelBuilder.createBox(size.x, size.y, size.z, GL20.GL_LINES,
                                    new Material(ColorAttribute.createDiffuse(Color.YELLOW)),
                                    VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal));
                    }
     });

     while (model == null)
     {
            //Gdx.app.log("TAG","2");
     }

      //point A
}