Остановить выполнение потока, когда он вызывает url.openStream () в цикле - PullRequest
0 голосов
/ 28 января 2019

Редактировать : Я знаю, что делает Thread.interrupt ().

  • while (!Thread.currentThread().isInterrupted()) не завершается, когда я прерываю поток.
  • Я также пытался отловить исключение из url.openStream ();когда поток прерывается (отчаяние, может быть, это был метод блокировки, а это не так) и выход из цикла без какого-либо успеха.

Приложение создает Thread, который постоянно читает a 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.");
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Я удалил MyRunnable.sleepOneSec, и ваш код начал работать.

0 голосов
/ 28 января 2019

Замените вызов метода sleepOneSec простым вызовом Thread.sleep.Поймать InterruptedException вне вашего while цикла.Это приведет к естественному завершению цикла:

try {
    while (true) {
        Thread.sleep(1000);
        readFromUrl(url);
        System.out.println("Read from " + website);
    }
} catch (InterruptedException e) {
    System.out.println("Script: Interrupted, exiting.");
}
0 голосов
/ 28 января 2019

Как правило, ваш MyRunnable поток прерывается во время сна.InterreuptedException брошен, но пойман.Кстати, ловить Exception - это плохая привычка, и вы не должны этого делать.Из javadoc: «Прерванный статус текущего потока очищается, когда выбрасывается это исключение».Поэтому ваш цикл while никогда не увидит флаг.

...