У меня есть простой класс Runnable, который должен перебирать два измерения мировых данных и выполнять функцию в каждой точке. У меня также есть логическое значение и метод возврата, который будет указывать, когда поток выполняется.Почему эта нить никогда не завершается?
public class Generator implements Runnable
{
private World world;
private Random seed;
private boolean genComplete = false;
public Generator(World world)
{
// Implementation
}
public boolean isComplete()
{
return genComplete;
}
/**
* Begins world generator thread.
*/
@Override
public void run()
{
world.initializeWorldTileData();
generateWholeWorld();
System.out.println("Completed");
genComplete = true;
}
/**
* Processes entire world generation tree.
*/
private void generateWholeWorld()
{
world.saveData();
for (int x = 0; x < world.getWorldSizeX(); x++)
{
for (int y = 0; y < world.getWorldSizeY(); y++)
{
// Example function.
x();
}
}
}
private void x()
{
// When nothing is performed genComplete equals true.
}
}
В соответствии с этим, например, при запуске метода generateWholeWorld()
полностью выполнен и Completed
печатается. Однако, если добавить какую-либо функцию в x()
:
private void x()
{
System.out.println("Example function");
}
Нить продолжает работать бесконечно (работает через для петли до бесконечности), даже если он должен быть в состоянии выполнить задачу в течение нескольких секунд. genComplete
никогда не соответствует истине.
Редактировать: нить создается и наблюдается с экрана загрузки графического интерфейса пользователя, который изменяется, когда значение genComplete
истинно.
private Thread generator;
private boolean doneGenerating;
public ScreenGenerateWorld(Screen parent, InitialWorldSettings settings)
{
super(parent);
world = World.createNewWorld(settings);
this.generator = new Thread(world.getWorldGenerator());
generator.start();
}
@Override
public void update()
{
doneGenerating = world.getWorldGenerator().isComplete();
if (doneGenerating)
{
info.setText("Press \"A\" to Continue...");
if (Keyboard.isKeyDown(Keyboard.KEY_A))
AntFarm.getAntFarm().changeActiveScreen(new ScreenWorld(parent, world));
}
// Render code
}
Вам нужно будет показать больше участвующих классов, в том числе о том, как вы создаете и запускаете свою нить. –