gpt4 book ai didi

Java - 线程不会停止

转载 作者:行者123 更新时间:2023-12-02 03:34:09 25 4
gpt4 key购买 nike

我有以下类,它嵌套在另一个类中(也扩展了线程)

public class Miner extends Thread {
private volatile boolean running = true;

public void setRunning(boolean running) {
this.running = running;
}
public boolean getRunning() {
return running;
}

private void MainLoop() {
if(!running) {
robot.keyRelease(KeyEvent.VK_D);
return;
}
robot.keyPress(KeyEvent.VK_D);
robot.keyRelease(KeyEvent.VK_D);
try {
Thread.sleep(100 + (int)(Math.random()*randInt));
} catch(Exception e) {}

MainLoop();
}

@Override
public void run() {
MainLoop();
}
}

然后在 Miner 嵌套的类中,我有

private void MainLoop() throws AWTException {
Miner miner = new Miner();
miner.start();
... does other stuff ...
while(miner.getRunning())
miner.setRunning(false);
... do more stuff ...
MainLoop();
}

但是,在我尝试将运行设置为 false 并停止矿工线程并执行“做更多事情”之后,在我做“做更多事情”的整个过程中,它仍然按 D 键。
< br/>包含 Miner 的类的完整 MainLoop() 方法。

private void MainLoop() throws AWTException {
if(stop)
return;
Miner miner = new Miner();
miner.start();
while(true) {
BufferedImage screenCap = robot.createScreenCapture(new Rectangle(x, y, 1, 1));
int c = screenCap.getRGB(0,0);
int red = (c & 0x00ff0000) >> 16;
int green = (c & 0x0000ff00) >> 8;
int blue = c & 0x000000ff;
Color color = new Color(red,green,blue);
if(color.equals(DRILL_COLORS[0]) || color.equals(DRILL_COLORS[1]))
break;
try {
Thread.sleep(500);
} catch(Exception e) {}
if(stop)
return;
}
while(miner.getRunning())
miner.setRunning(false);
count++;
if(count >= 3) {
up = !up;
count = 0;
}

switch(moveDir) {
case 0:
if(up)
holdKey(KeyEvent.VK_UP, 100 + (int)(Math.random()*randInt));
else
holdKey(KeyEvent.VK_DOWN, 100 + (int)(Math.random()*randInt));
break;
case 1:
if(up)
holdKey(KeyEvent.VK_RIGHT, 100 + (int)(Math.random()*randInt));
else
holdKey(KeyEvent.VK_LEFT, 100 + (int)(Math.random()*randInt));
break;
}

switch(wallLoc) {
case 0:
holdKey(KeyEvent.VK_UP, 50);
break;
case 1:
holdKey(KeyEvent.VK_DOWN, 50);
break;
case 2:
holdKey(KeyEvent.VK_RIGHT, 50);
break;
case 3:
holdKey(KeyEvent.VK_LEFT, 50);
break;
}

MainLoop();
}

目标基本上是让矿工线程按下 D 键,直到它检测到屏幕上某个点上的某种颜色。然后它应该停止矿工线程,同时稍微移动我的角色,然后重新调用该方法并重新开始。但矿工线程一直在运行。

最佳答案

这里没有停止条件:

private void MainLoop() throws AWTException {
Miner miner = new Miner();
miner.start();
... does other stuff ...
while(miner.getRunning())
miner.setRunning(false);
... do more stuff ...
MainLoop();
}

最后的方法调用自身=> MainLoop();,这是一个递归无限循环。
在此方法中,创建一个新的 Miner 对象,启动一个新线程,再次按下 D,然后停止线程,然后 ...执行更多操作东西..然后整个循环再次开始。

关于Java - 线程不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37646599/

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