我正在使用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
}
答案 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
}