java程序不停止线程
所以我有一个线程,我以前无法运行,但现在由于这个网站上的一个成员而解决了,这个问题可以找到here
为了停止我的线程,我在thread类中创建了一个布尔值,并将其设置为false,如果设置为true,那么线程应该停止。我甚至会通过打印线程来检查何时停止线程,但它会打印true(它应该这样做),但线程会继续运行
我的线程(CheckFiles.java)类如下所示
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class CheckFiles extends Thread {
static boolean stop = false;
public void run() {
while (!stop) {
System.out.println("Thread " + stop);
try {
String line;
BufferedReader b = new BufferedReader(new FileReader(UserInterface.location));
while((line = b.readLine()) != null) {
Ststem.out.println(line);
}
} catch (IOException e) { System.out.println(e); }
}
}
}
为了停止线程,我有一个按钮,它的代码如下所示
stopChecking.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
CheckFiles.stop = true;
System.out.println(CheckFiles.stop); //Prints true when pressed
}
});
为什么我的线程没有停止,或者有更好的方法吗
编辑:当我试图中断线程时,我得到了语法错误
Cannot make a static reference to the non-static method interrupt() from the type Thread
另外,当我使布尔停止时,线程仍在运行
# 1 楼答案
线程在
b.readLine()
上阻塞,因为这行代码会导致线程执行暂停,直到有一些可用的输入要“强制”停止,请使用
Thread.interrupt()
例如:
内部读数回路也应进行如下修改:
由于中断只是解除了I/O的阻塞,在继续执行另一次阻塞读取之前,我们需要检查stop是否仍然是
false
正如其他人所建议的,另一种方法是在设置
stop = true;
之后直接调用b.close()
编辑:
正如Vakh所说,您还应该设置布尔值
volatile
,以便所有线程都能立即看到对stop
变量的更新# 2 楼答案
使用线程中断标志终止:
现在,您可以使用
ExecutorService
计划文件检查器:通过取消
Future
或关闭执行器来停止文件检查器:# 3 楼答案
当您使用b.close()停止bufferedreader时,这不会停止线程吗