【发布时间】:2023-09-21 23:43:01
【问题描述】:
编辑:我知道 Thread.interrupt() 做了什么。
-
while (!Thread.currentThread().isInterrupted())在我中断线程时不会退出。 - 我还尝试从 url.openStream() 中捕获异常;当。。。的时候 线程被中断(绝望,也许是阻塞方法, 不是)并退出循环,没有任何成功。
应用程序创建一个Thread,它连续读取一个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.");
}
}
}
【问题讨论】:
-
我知道 Thread.interrupt() 做了什么亲爱的@PM77-1,但如果我在这里做错了什么,请分享。
标签: java concurrency interrupt interrupt-handling