gpt4 book ai didi

java - 在循环中调用 url.openStream() 时停止线程执行

转载 作者:行者123 更新时间:2023-11-29 04:12:18 30 4
gpt4 key购买 nike

编辑:我知道 Thread.interrupt() 的作用。

  • while (!Thread.currentThread().isInterrupted()) 在我中断线程时不退出。
  • 我还尝试从 url.openStream() 捕获异常;当。。。的时候线程被中断(无奈,可能是阻塞方法,这不是)并退出循环,没有任何成功。

应用程序创建一个线程,它连续读取一个URL。 3 秒后 Thread 被中断但不幸的是继续执行。

如何停止线程执行?

代码(Main.java、MyRunnable.java):

public class Main {

public static void main(String[] args) {
MyRunnable runnable = new MyRunnable("http://ninjaflex.com/");
Thread thread = new Thread(runnable);
thread.start();
sleep(3000);
thread.interrupt();
System.out.println("Thread.interrupt() invoked.");
}

private static void sleep(long timeMilli) {
try {
Thread.sleep(timeMilli);
} catch (Exception e) {

}
}
}

public class MyRunnable implements Runnable {

private String website;

MyRunnable(String website) {
this.website = website;
}

@Override
public void run() {
URL url = createUrl();
if (url != null) {
while (!Thread.currentThread().isInterrupted()) {
sleepOneSec();
readFromUrl(url);
System.out.println("Read from " + website);
}
System.out.println("Script: Interrupted, exiting.");
}
}

private URL createUrl() {
URL url = null;
try {
url = new URL(website);
} catch (MalformedURLException e) {
System.out.println("Wrong URL?");
}
return url;
}

private void sleepOneSec() {
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println("Error sleeping");
}
}

private void readFromUrl(URL url) {
InputStream in = null;
try {
in = url.openStream();
} catch (Exception e) {
System.out.println("Exception while url.openStream().");
e.printStackTrace();
} finally {
closeInputStream(in);
}
}

private void closeInputStream(InputStream in) {
try {
in.close();
} catch (IOException e) {
System.out.println("Error while closing the input stream.");
}
}
}

最佳答案

基本上,您的 MyRunnable 线程在 sleep 期间被中断。 InterreuptedException 被抛出但被捕获。顺便说一句,捕获 Exception 是一个坏习惯,您不应该那样做。来自 javadoc:“抛出此异常时,当前线程的中断状态被清除”。因此,您的 while 循环永远不会看到标志。

关于java - 在循环中调用 url.openStream() 时停止线程执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54404222/

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