Avatar billede roo104 Nybegynder
24. september 2003 - 19:50 Der er 22 kommentarer og
1 løsning

Flere DatagramSocket via tråde

Jeg skal have sendt fx 10 pakker til 10 forskellige ip'er.
Jeg har en timeout på 2000 ms, hvis alle pakker fejler vil det så tage 20 sec får jeg får svar om at alle pakker fejlede. Er der ikke muligt at lave 10 tråde som sender til hver ip på "samme" tid, så der i alt kun går 2 sec, ligemeget hvor mange ip'er der sendes til ?

Jeg har prøvet at gøre sådan her, men uden held:
public HLServerThread(String hostname) {
        this.hostname = hostname;
    }
   
    public synchronized void run() {
        try {
            DatagramSocket socket = new DatagramSocket();
            socket.setSoTimeout(2000);

            String[] addressPort = splitServerPort(hostname);

            InetAddress addr = InetAddress.getByName(addressPort[0]);
            DatagramPacket sendPacket = new DatagramPacket(command, command.length, addr, Integer.parseInt(addressPort[1]));
            socket.send(sendPacket);

            DatagramPacket recvPacket = new DatagramPacket(recvData, recvData.length);
            socket.receive(recvPacket);
            socket.close();

En lille test klasse:
Vector v = new Vector();
        HLServerThread server;
        double time1 = System.currentTimeMillis();
       
        for (int i = 0 ; i < 10 ; i++) {         
            server = new HLServerThread("137.224.240.7:27015");
            Runnable runner = server;

            Thread t1 = new Thread(runner);

            t1.start();

            t1.join();
               
            v.add(server);
        }

Mit problem ligger også i at jeg har t1.join(), den vil vente til tråden er færdig, men har jeg den ikke med får jeg ikke udført alt det i run metoden.

Hvordan ville du/i gøre ?
Avatar billede arne_v Ekspert
24. september 2003 - 19:54 #1
Lav 2 for løkker.

En hvor du starter trådene.

Og en anden hvor du venter på dem.
Avatar billede arne_v Ekspert
24. september 2003 - 19:56 #2
Et kode fragment:

        long start = System.currentTimeMillis();
        MyThread[] t = new MyThread[10];
        for(int i = 0; i < t.length; i++) {
            t[i] = new MyThread();       
        }
        for(int i = 0; i < t.length; i++) {
            t[i].start();     
        }
        for(int i = 0; i < t.length; i++) {
            try {
                t[i].join();       
            } catch (InterruptedException e) {
                // ignore
            }
        }
        long end = System.currentTimeMillis();
Avatar billede arne_v Ekspert
24. september 2003 - 19:57 #3
(det bruger så 3 for løkker, men det er bare mig)
Avatar billede roo104 Nybegynder
24. september 2003 - 20:04 #4
prøver mig lige frem, går ud fra at MyThread klassen indeholder din run() metode ?
Avatar billede arne_v Ekspert
24. september 2003 - 20:09 #5
Ja.
Avatar billede arne_v Ekspert
24. september 2003 - 20:09 #6
Pointen er meget simpel. Du starter bare alle trådene iden du giver
dig til at vente på en af dem.
Avatar billede roo104 Nybegynder
24. september 2003 - 20:13 #7
Sådan som jeg har det nu får jeg ikke lavet en tråd i HLServerThread klasse, den har bare en run() metode da jeg har implemeteret java.lang.Runnable
Avatar billede roo104 Nybegynder
24. september 2003 - 20:13 #8
ahhh nu fik jeg også accepteret, lidt for tidligt
Avatar billede arne_v Ekspert
24. september 2003 - 20:16 #9
class MyThread extends Thread {
    public MyThread() {
    }
    public void run() {
      // whatever
    }
}
Avatar billede arne_v Ekspert
24. september 2003 - 20:16 #10
extends Thread

gør det !
Avatar billede roo104 Nybegynder
24. september 2003 - 20:18 #11
jeg har prøvat med:
HLServerThread[] t = new HLServerThread[10];
        double time1 = System.currentTimeMillis();
       

        for(int i = 0; i < t.length; i++) {
            t[i] = new HLServerThread("137.224.240.7:27015");
            Runnable runner = t[i];
            t[i] = new Thread(runner);     
        }
        for(int i = 0; i < t.length; i++) {
            t[i].start();   
        }
        for(int i = 0; i < t.length; i++) {
            t[i].join();     
        }

Men det duer ik, hvor skal tråden oprettes ?
Avatar billede arne_v Ekspert
24. september 2003 - 20:20 #12
Lad HLServerThread extende Thread og s¨å:

        HLServerThread[] t = new HLServerThread[10];
        for(int i = 0; i < t.length; i++) {
            t[i] = new HLServerThread("137.224.240.7:27015");
        }
        for(int i = 0; i < t.length; i++) {
            t[i].start(); 
        }
        for(int i = 0; i < t.length; i++) {
            t[i].join();   
        }
Avatar billede arne_v Ekspert
24. september 2003 - 20:21 #13
Medmindre naturligvis at HLServerThread allerede extender noget andet ??
Avatar billede roo104 Nybegynder
24. september 2003 - 20:21 #14
HLServerThread[] t = new HLServerThread[10];
        double time1 = System.currentTimeMillis();
       

        for(int i = 0; i < t.length; i++) {
            t[i] = new HLServerThread("137.224.240.7:27015"); 
        }
        for(int i = 0; i < t.length; i++) {
            t[i].start();   
        }
        for(int i = 0; i < t.length; i++) {
            t[i].join();     
        }

virker, men min constructor laver ikke så meget endnu, skal jeg flytte selve DatagramSocket oprettelse om i constructoren, den havde jeg lagt i run metoden
Avatar billede arne_v Ekspert
24. september 2003 - 20:23 #15
Tja - det er vel mest et spørgsmål om hvad du synes der er pænest.
Avatar billede roo104 Nybegynder
24. september 2003 - 20:25 #16
Yes nu virker det brugete min gamle klasse uden run metode, og lod den bare extende Thread...tak arne, det giver godt nok performance der kan mærkes
Avatar billede arne_v Ekspert
24. september 2003 - 20:29 #17
Uden run ? Du mener med run ikke ?
Avatar billede roo104 Nybegynder
24. september 2003 - 20:33 #18
nej...jeg overskriver ihvertfald ikke run() metoden
Avatar billede roo104 Nybegynder
24. september 2003 - 20:35 #19
ja hov, der er noget galt
Avatar billede arne_v Ekspert
24. september 2003 - 20:35 #20
Er du så sikker på at der ovehovedet sker noget i de tråde ?
Avatar billede roo104 Nybegynder
24. september 2003 - 20:39 #21
gik tilbage til den opreindelige klasse _med_ run metode, hvor DatagramSocket oprettelse ligger i run metoden. Så henter den 10 servere på max 2 sec
Avatar billede arne_v Ekspert
24. september 2003 - 20:41 #22
D.v.s. at nu virker det ?
Avatar billede roo104 Nybegynder
24. september 2003 - 20:46 #23
Yes, det kører endda rigtigt godt :)
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