gpt4 book ai didi

java - java线程间变量持久化相关问题

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:35 25 4
gpt4 key购买 nike

全部。我正在处理的 Java 程序中的一个线程会在空间中随机行走(或者至少,一旦这个问题得到解决,它就会)。它包含以下两个方法:

public void run() {
while(gw.checkBoundingBox()) {
if(!gw.pause) step();
}
}

public void step() {

Point3d p1, p2;

//get the last point, step, get the new point
p1 = new Point3d(gw.position);
gw.randomStep();
p2 = new Point3d(gw.position);

//create the Alpha that will do the animation, and wrap it in an AlphaControl,
//which will set this object's pause flag until the Alpha finishes
Alpha alpha = new Alpha();
alpha.setLoopCount(1);

if(alpha.finished()) System.out.println("DEBUG: I'm already dead.");

AlphaControl ac = new AlphaControl(alpha,gw);
ac.start();

//create a piece of the path, attach an interpolator to do the animation
PathCyl cyl = new PathCyl(p1,p2);

StretchInterpolator si = new StretchInterpolator(alpha, cyl.anchor);
si.setSchedulingBounds(new BoundingSphere(new Point3d(0,0,0),50));
cyl.anchor.addChild(si);

//put it all together
BranchGroup b = new BranchGroup();
b.addChild(cyl.tg);
trans.addChild(b);
}

因此,如果未设置暂停标志,它将运行 step()。您需要查看的 step() 的唯一部分是关于 Alpha 对象的几行。 (Alpha 是一个 API 类,它产生一个用于动画的时间相关函数)。因此 step() 创建了一个 Alpha 对象,然后将其提供给另一个名为 AlphaControl 的线程。 AlphaControl 告诉程序停止计算点,直到这一步完成动画。它通过设置在 run() 方法中检查的暂停标志来实现。

那么问题是什么?请注意,我添加了一个调试行,它会在 Alpha 创建后立即检查它是否完成。这行代码似乎永远不应该执行。阿尔法完成了吗?当然不是,我们只是创造了它。但是这一行在每次第一次调用该函数时都会执行。它以某种方式卡在同一个 Alpha 实例上并一遍又一遍地使用它。我假设这是因为对 AlphaControl 线程中仍然存在的 Alpha 的引用。

那么我该如何解决这个问题呢?我尝试了几件事。我创建了一个巨大的 Alpha 数组,甚至在步行开始之前就将它们全部初始化,并试图告诉它在每一步都使用数组中不同的 alpha,但结果相同。我还尝试使用 AlphaControl 在它关闭之前将 alpha 设置为 null,但这也没有用。是否有可能销毁此对象?当 step() 代码再次运行时,第一次创建的 AlphaControl 应该完成并等待垃圾回收。

此外,为了防止看到它会有所帮助,这里是 AlphaControl 类。

public class AlphaControl extends Thread {

public Alpha alpha;
public GraphicalWalker gw;

public AlphaControl(GraphicalWalker gw, Alpha alpha) {
this.gw = gw;
this.alpha = alpha;
}

public void run() {

boolean stop = false;
boolean finished;

while(!stop) {
finished = alpha.finished();

if( !finished && !gw.pause ) gw.pause = true;
if( finished && gw.pause ) gw.pause = false;
if(finished) stop = true;
}
}

}

在此先感谢您的帮助。杰夫

最佳答案

我认为理解代码失败原因的关键是理解 Java3D 库的 Alpha 类的作用。从你的问题来看,在我看来你没有正确理解它。 它不循环。如果您查看源代码 (http://www.java2s.com/Open-Source/Java/6.0-JDK-Modules/java-3d/javax/media/j3d/Alpha.java.htm),您会发现它不包含单个循环结构。它所做的是定义一个函数,将时间值映射到 [0,1] 范围内的值。

如果您查看 finished() 方法的源代码:

    /**
* Query to test if this alpha object is past its activity window,
* that is, if it has finished looping.
* @return true if no longer looping, false otherwise
*/
public boolean finished() {
long currentTime = paused ? pauseTime : J3dClock.currentTimeMillis();
return ((loopCount != -1) &&
((float)(currentTime - startTime) * .001f > stopTime));
}

您注意到它的值取决于何时它被调用。

并且由于您基本上将 alpha 定义为具有 1 毫秒的 1 个循环,因此从创建时间开始,它不会在您创建该 alpha 后的 1 毫秒内完成,并在此后完成。

希望对您有所帮助。

关于java - java线程间变量持久化相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com