作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的 Runnable 类,它应该迭代世界数据的两个维度,并在每个点执行一个函数。我还有一个 boolean 值和一个返回方法,可以告诉线程何时完成。
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");
}
线程保持无限运行(无休止地运行 for 循环),即使它应该能够在几秒钟内执行任务。 genComplete
永远不等于 true。
编辑:正在创建线程,并从 GUI 加载屏幕观察该线程,当 genComplete
为 true 时,该屏幕会发生变化。
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
}
最佳答案
多线程 Java 应用程序中的可变状态终止。我强烈建议您对 genComplete 状态变量进行一些同步,以便所有线程对其值有一个共同的 View 。
public class Generator implements Runnable
{
...
private boolean genComplete = false;
public synchronized void setComplete() {
getComplete = true;
}
public synchronized isComplete() {
return genComplete;
}
...
/**
* Begins world generator thread.
*/
@Override
public void run()
{
world.initializeWorldTileData();
generateWholeWorld();
System.out.println("Completed");
setComplete();
}
...
}
关于java - 为什么这个线程永远不会自行完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734235/
我发现以下帖子非常有帮助: How to pickle yourself? 但是,此解决方案的局限性在于,重新加载类时,它不会以其“运行时”状态返回。即它将重新加载所有变量等以及类在转储时的一般状态.
我是一名优秀的程序员,十分优秀!