gpt4 book ai didi

java - 如何在 Java 中停止线程?

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

我制作了一个带有 GUI 的 java 程序,我想要一个停止按钮功能,当用户点击停止按钮时,程序必须停止。

  1. 在我的程序中,主线程启动其他 10 个线程,我希望每当单击停止按钮时,所有 10 个线程都必须在主线程之前停止。

  2. 其次,我还希望每当这 10 个线程中的任何一个线程停止时,它都必须首先关闭它之前打开的所有资源,例如与数据库的连接等。

我已经实现了......回答的代码

现在有一个问题。

我的线程类是这样的:

public class ParserThread implements Runnable {
private volatile boolean stopped = false;

public void stopTheThread() {
stopped = true;
}
:
:
}

下面是从函数start()开始的10个线程的主线程

public class Main() {
Thread [] threads;

public void start() {
for(int i = 0; i < 10; i++) {
threads[i] = new Thread(new ParserThread());
}
}

public void stop() {
// code to stop all the threads
}
}

现在我想调用ParserThread 的stop 方法来设置“stopped = true”来停止线程。我希望为所有 10 个线程完成这件事。

如何调用该停止方法。我希望它在 Main 类的 stopAllThreads() 方法中完成。

最佳答案

一般来说,做到这一点的方法是让每个其他线程定期检查一个标志。后台线程经常循环,等待工作——它们只需要在每次循环时检查标志。如果他们正在使用 Object.wait() 或类似的东西来告诉他们还有更多的工作,则应该使用相同的通知来指示线程也应该停止。 (不要一直旋转直到停止 - 这会消耗 CPU。不要只使用 sleep - 这会延迟终止。)

这允许所有线程干净地终止,适本地释放资源。其他选项,如 interrupt() 和已弃用的 destroy() 方法更难正确控制,IMO。 (中断一个线程比硬中止它要好,但它有自己的一系列问题——比如中断只在某些点被处理。)

编辑:在代码中,它看起来像:

// Client code
for (Task task : tasks) {
task.stop();
}

// Threading code
public abstract class Task implements Runnable {

private volatile boolean stopped = false;

public void stop() {
stopped = true;
}

protected boolean shouldStop() {
return stopped;
}

public abstract void run();
}

然后您的任务将成为 Task 的子类。如果您希望 stop() 方法也通知监视器,则需要稍微复杂一些,但这是基本思想。

示例任务:

public class SomeTask extends Task {
public void run() {
while (!shouldStop()) {
// Do work
}
}
}

关于java - 如何在 Java 中停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611862/

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