Avatar billede droida38 Nybegynder
08. maj 2003 - 14:30 Der er 8 kommentarer

InputStream hænger??!

Har et mystisk problem som jeg håber andre er stødt på. Men den er nok lidt svær :(

Har et program som taler med en apache server. Via to tråde laves to forskellige URL objekter. Den ene tråd laver en forbindelse via

URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();

og går herefter i gang med at læse fra is.

Umiddelbart efter forsøger tråd 2 at åbne en forbindelse til en anden url på samme server. Men ved:
InputStream is = uc.getInputStream();
hænger begge tråde.

Det ser ud som om de hænger i  java.net.SocketInputStream.socketRead0() (native metode).
Nærmest som om de to forbindelse forstyrrer hinanden.

Problemet ses under Java1.4.1 men ikke under MS Jview ??!
Avatar billede arne_v Ekspert
08. maj 2003 - 19:44 #1
Er din kode passende thread-safe ?
Avatar billede lifo Nybegynder
08. maj 2003 - 21:15 #2
hvor laver du de tråde ??
om du laver en tråd udfra samme uc object  så får du fejl lige gyldigt om du har sat url til forskellige url's
Avatar billede arne_v Ekspert
10. maj 2003 - 00:19 #3
droida38>

Er du kommet videre ?
Avatar billede droida38 Nybegynder
12. maj 2003 - 10:27 #4
Tak for kommentarene, det var mere end jeg turde håbe på :)

Først lifo - jeg er ikke helt med på dit spørgsmål? Jeg har en tråd som er barn af awt-tråden, den laver de to tråde på traditionel vis (new Thread()).

arne_v : Passende Thread safe? Jeg har ikke gjort noget for at gøre den thread-safe, for hvad bør jeg gøre? Har to forskellige tråde, som opretter to forskellige URL objekter og arbejder på deres URLConnection, burde det ikke være thread-safe nok?
Avatar billede arne_v Ekspert
12. maj 2003 - 10:38 #5
Passende thread safe = de 2 tråde forsøger ikke at opdatere samme
data samtidigt.
Avatar billede arne_v Ekspert
12. maj 2003 - 10:39 #6
Hvis det er to forskellige URLConnection objekter så burde det være OK.
Avatar billede droida38 Nybegynder
12. maj 2003 - 11:51 #7
Det er to forskellige URLConnection objekter... suk
Avatar billede hansmorten Nybegynder
16. maj 2003 - 20:46 #8
Tag nedenstående kode og sammenlign med din egen. Lars

java version "1.4.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06)
Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)


import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.util.ArrayList;

public class UrlTest {
  private static final int NUMBER_OF_THREADS = 25;
  private Thread[] threads = new Thread[NUMBER_OF_THREADS];

  private static Thread create() {
    return new Thread() {
      public void run() {
        BufferedReader in = null;
        try {
          URL u = new URL("http","www.eksperten.dk",80,"/spm/350101");
          URLConnection connection = u.openConnection();
          InputStream inTemp = connection.getInputStream();
          if (inTemp == null) {
            System.err.println("Unable to read the server result");
            return;
          } else {
            in = new BufferedReader(new InputStreamReader(
                  connection.getInputStream()));

          int count = 0;
          ArrayList strings = new ArrayList();
          while (in.ready()) {
            strings.add(in.readLine());
            count++;
          }

          System.out.println("Thread "+this.getName()+" read "+count+" lines");
          if (this.getName().equals("Thread-1")) {
            System.out.println("Read:");
            int size = strings.size();
            for (int i=0; i<size; i++) {
              System.out.println((String) strings.get(i));
            }
          }
          }
        } catch (MalformedURLException e) {
          System.err.println("Thread "+this.getName()+" has failed");
          e.printStackTrace();
          return;
        } catch (IOException e) {
          System.err.println("Thread "+this.getName()+" has failed");
          e.printStackTrace();
          return;
        } finally {
          try {
            if (in != null) {
              in.close();
            }
          } catch (IOException e) {
            System.err.println("Thread "+this.getName()+" has problems while closing the connection");
            return;
          }
        }
      }
    };
  }


  public void run() {
    System.out.println("Creating threads...");
    for (int i = 0; i < NUMBER_OF_THREADS; i++) {
      threads[i] = create();
    }

    System.out.println("Starting threads...");
    for (int i = 0; i < NUMBER_OF_THREADS; i++) {
      threads[i].start();
    }

    for (int i = 0; i < NUMBER_OF_THREADS; i++) {
      try {
        threads[i].join();
        System.out.print("x");
      } catch (InterruptedException e) {
        e.printStackTrace();
        System.err.println("Interrupted while waiting");
        return;
      }
    }
    System.out.println("");


  }

  public static void main(String args[]) {
    UrlTest urlTest = new UrlTest();
    urlTest.run();
  }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester