gpt4 book ai didi

java - 如何完全停止线程的执行

转载 作者:行者123 更新时间:2023-12-02 01:46:15 25 4
gpt4 key购买 nike

我搜索了 StackOverflow,但找不到问题的答案。

我有一个主要类(class):-

public class Main {
public static Thread game = new Thread(new Start());
public static void main(String[] args) {
game.start();
try {
game.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

我有游戏线程(开始类):-

public class Start implements Runnable {
private Timer timer = new Timer();
private Thread timerThread = new Thread(timer, "timer");
@Override
public void run() {
...
try {
play();
}
catch(IOException e) {
e.printStackTrace();
}
}
public void play() throws IOException {
...
timerThread.run();
System.out.print("Enter a letter: ");
char input = sc.next().toUpperCase().charAt(0);
...
if(isPlaying) play();
}
}

我有 Timer 类:-

public class Timer implements Runnable {

@Override
public void run() {
for (int i = 1; i <= 15; i++) {
try {
System.out.println(i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Main.game.interrupt();
}
}

现在问题来了,当我开始游戏时,计时器也开始了。但在 15 秒结束时,Timer 线程停止。但程序并没有停止执行。

15秒后,编译器仍然愿意接受输入。输入后,程序停止。

我想立即强制停止线程。 15 秒后不久,我想在那一刻停止游戏线程的执行。

我查看了 Youtube 上的一些多线程教程以及 StackOverflow 上之前提出的一些问题,但未能找到解决方案。

最佳答案

您是否收到NullPointerException

我测试了你的解决方案,这就是我得到的。如果是这种情况,您的问题是您尝试在初始化 Main 类中的静态属性之前初始化 Timer 中的 game 字段.

为了您的理解,让我重新表述一下:当你的代码运行时

private Thread game = Main.game;

Main.game 中没有任何内容,这是因为 Main.game 将在 Start 初始化之后初始化Timer 实例。

解决这个问题的最简单方法是删除 Timer 的 private Thread game 属性,然后调用 Main.game.interrupt();

编辑 01:一旦解决了第一件事,您就需要了解线程中断是如何工作的。当您调用 Main.game.interrupt(); 时,如果线程正在 sleep ,您只会立即停止它。如果是这种情况,线程将抛出 InterruptedException,但这不是我们想要的,我不会推荐它。在正常流程中,.interrupt() 方法的执行会将目标线程的状态设置为“已中断”,但这只是一个 boolean 标志,它不会(还)不要改变任何事情。您需要做的是检查递归方法中该标志的状态,以便当“中断”标志的值等于 true 时,您将把 isPlaying 的值更改为 false。这就是你的线程将停止的方式。

在代码中它会是这样的:

 

public void play() throws IOException {
...
timerThread.run();
System.out.print("Enter a letter: ");
char input = sc.next().toUpperCase().charAt(0);
if (Thread.interrupted()) {
System.out.println("I should interrupt myself! ;)");
isPlaying = false;
}
...
if(isPlaying) play();
}

希望这有帮助:)

关于java - 如何完全停止线程的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53650114/

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