Zatrzymać wątek

0

Pracuję właśnie nad kodem odpowiedzialnym za pobieranie strony internetowej w osobnym wątku czyli asynchronicznie.
Utworzyłem klasę rozszerzającą Thread i umieściłem w niej te 3 metody:

private String ReadHTML(URL url, HttpMethod method)
{
HttpURLConnection con;
BufferedReader reader = null;
InputStream inputStream = null;
OutputStream outputStream = null;
InputStreamReader inputStreamReader = null;
StringBuffer content = null;
try
{
con = ((HttpURLConnection)url.openConnection());
inputStream = con.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
reader = new BufferedReader(inputStreamReader);
content = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try {
inputStream.close();
inputStreamReader.close();
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
} 

public void run()
{
try
{
this.ReadHTML(url, HttpMethod.GET);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}

public void cancelAsync()
{
// i co tutaj napisać?
}

Jak wiadomo, żeby pobrać kod wywołujemy metodę start() na obiekcie tej klasy.
A jak taką metodę zatrzymać? Oczywiście metodą cancelAsync()
Tylko pytanie: co wpisać w tej metodzie, aby zatrzymać pobieranie kodu strony? Używałem już stop(), interrupt(), destroy() no i nic nie przynosi efektów :( Szukałem także na próżno jakieś metody w HttpURLConnection typu abort().. też nic. Cóż by tu zrobić?

0
while (!interrupted() && (line = reader.readLine()) != null) {
    content.append(line).append("\n");
}

.........

myThread.interrupt()

poczytaj API, zwlaszcza Thread: interrupted(), isInterrupted(), sleep() i InterruptedException
pozdrawiam

0

:/ Pomysł niby dobry, ale:

  • nie wydaje się wam, że kod (a raczej jego wykonanie) będzie wolniejsze?
  • zaprzęgając do pracy sniffera zauważyłem, że po wykonaniu metody cancelAsync() z interrupt() w środku kod strony nadal się pobiera :/ Kod strony swoją drogą, ale co by było, gdybym ściągał przykładowy plik mający kilkaset MB i użytkownik chciałby zatrzymać pobieranie? Klika "Cancel", niby pobieranie się zatrzymuje, a tu dalej jednak trwa, MB po MB...
  • no i w końcu wyobraźmy sobie taką sytuację, że podczas łączenia użytkownik chce zatrzymać pobieranie (łączenie czyli ta linika:)
    inputStream = con.getInputStream();
    wtedy sprawdzanie wartości interrupted() jest bezskuteczne... trzeba by utworzyć timer z 1s okresem który by sprawdzał wartość tej zmiennej.. normalnie żenada...

Próbowałem już nawet wszystkie HttpURLConnection, wszystkie Streamy ustawiać na null, a jednak kod strony nadal jest pobierany :/ wątek ustawiam na null, a to *** dalej działa... jedyne co pomaga to wyłączenie programu, ale to chyba nie jest dobre rozwiązanie ;-)
Proszę o pomoc!

0
while(!isInterrupted()){ //zmiana - tu nie zerujemy flagi
   //some code
}
if(interrupted()){
   myInputStream.close()
}

?

0

Owszem - zamknięcie strumienia przynosi rezultat, pobieranie kodu strony zostaje zatrzymane, natomiast problem jest w tej linice:

inputStream = con.getInputStream();

Załózmy, że użytkownik ustawia sobie TimeOut połączenia na 60s. W chwili, gdy próbuje połączyć się z jakąś tam stroną serwer nie odpowiada (np po 15 s), program zatrzymuje się na wyżej wymienionej linice. Nie pomogą żadne kody w stylu:

while(!isInterrupted()){ //zmiana - tu nie zerujemy flagi
inputStream = con.getInputStream();
}

Użytkownik wciska "anuluj", jednak dopiero po upływie TimeOutu wykonyuwana jest następna linika programu (w moim przykładzie to aż 45s!). Macie jakieś inne pomysły? W HttpURLConnection jest taka abstrakcyjna metoda disconnect. Może na nią należy zwrócić szczególną uwagę?

0

java.nio

0
try{
	System.out.println("Connecting to "+url+"...");
	s=new Socket();//nowy socket
	s.connect(new InetSocketAddress(url,666),10000);//timeout 10sec
	System.out.println("...done!");
}catch (Exception e) {
//timeout
}
//Tu kod kiedy sie polaczylismy

1 użytkowników online, w tym zalogowanych: 0, gości: 1