我有一个场景:
我有一个调用方法的线程,我使用默认HTTP客户端来执行请求。为了获得响应,我打开一个InputStream并使用一个Buffred Reader来读取流。
while(s = buffer.readline ....)
在while循环中,我一直在查看响应并查看字符串"您好" ...如果我收到字符串,我会发回响应对象..
现在这个场景适用于我的第一点。但我在第二点面临问题。
当我按回键时,我需要停止我的线程。
但我无法做到。我试过了:
以上都不奏效。事实上我的线程一直在运行...
我不清楚问题是否与Thread有关,或问题是流的While循环。
因为我看到while循环始终在执行..
请帮助我解决此问题的最佳方法...是关闭线程还是关闭流。
请帮我找到关闭流并关闭线程的方法。
答案 0 :(得分:0)
不推荐使用thread.destroy()。不要使用它。
停止IO绑定线程最安全的方法是中断它。
线程的逻辑必须合作:(1)检查isInterrupted()状态和 (2)捕获InterruptedException异常。
重要的是,上述#1和#2都将被处理。中断()a 线程可以在某些情况下导致异常,而在其他情况下导致异常 状态毫无例外!
安全的线程实现如下:
class MyThread {
private volatile boolean wasStopped;
public void run() {
try {
while (!Thread.currentThread().isInterrupted() && !wasStopped) {
do_thread_work();
}
} catch (InterruptedException e) {
return; // gracefully stop thread
}
}
public void gracefullyStop() {
wasStopped = true;
this.interrupt();
}
}
停止线程调用
thread.gracefullyStop();
只要线程逻辑函数(do_thread_work),这种模式就可以正常工作 不会内部捕获&解雇InterruptedException。请注意。
您将看到仅依赖于isInterrupted()检查的其他实现
没有额外的wasStopped标志。我认为这是一种不好的做法。
为什么?
因为如果在线程处于等待模式时引发了interrupt()
即在函数wait()join()或sleep()内部,线程确实会被唤醒,
但其中断状态将设置为false 。