🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
9 messages
9 total messages Started by Passero Mon, 14 Feb 2005 19:38
[Java] vraagje ivm Threads
#1516
Author: Passero
Date: Mon, 14 Feb 2005 19:38
34 lines
2335 bytes
Ik zoek in java een systeem om een thread op te starten die het inlezen van
serverberichten afhandelt. Het probleem is dat de lijn: in.readline(); waar
in een BufferedReader is die gekoppeld is aan de Socket blijft wachten als
de server niets stuurt maar ondertussen wil ik wel andere dingen doen. Ik
weet niet echt hoe ik dit moet oplossen. Dit is mijn thread:
Ik weet niet wanner ik berichten van de server krijg of hoeveel het er zijn
maar ondertussen moet ik ook op gelijk welk tijdstip zelf berichten kunnen
sturen naar de server.

public class SessieThread extends Thread
{
    private BufferedReader in;

    public SessieThread(BufferedReader in)
    {
        super("Sessie");
        this.in = in;
        run();
    }

    public void run()
    {
        String bericht = "";
        try
        {
            while (true)
            {
                bericht = in.readLine();
                if (!bericht.equals(""))
                    System.out.println(bericht);
            }
        }catch(Exception ex){ex.printStackTrace();}
    }
}
Re: [Java] vraagje ivm Threads
#1517
Author: robert
Date: Mon, 14 Feb 2005 21:26
20 lines
1978 bytes
Passero <yanongena@pandora.be>:
 > Ik zoek in java een systeem om een thread op te starten die het inlezen
 > van serverberichten afhandelt. Het probleem is dat de lijn:
 > in.readline(); waar in een BufferedReader is die gekoppeld is aan de
 > Socket blijft wachten als de server niets stuurt maar ondertussen wil ik
 > wel andere dingen doen. Ik weet niet echt hoe ik dit moet oplossen. Dit
 > is mijn thread: Ik weet niet wanner ik berichten van de server krijg of
 > hoeveel het er zijn maar ondertussen moet ik ook op gelijk welk tijdstip
 > zelf berichten kunnen sturen naar de server.

BufferedReader heeft een ready() method waarmee je kunt nagaan of er data
in de buffer aanwezig is. Daarnaast zitten er in java.nio.channels een
aantal mogelijkheden voor non-blocking I/O; voor socket-I/O kan je
bijvoorbeeld eens kijken naar java.nio.channels.ServerSocketChannel

Zie ook http://www-106.ibm.com/developerworks/library/j-perf03174.html voor
een voorbeeldje.

-- 
                                                                     robert
Re: [Java] vraagje ivm Threads
#1518
Author: Passero
Date: Mon, 14 Feb 2005 21:45
30 lines
2581 bytes
"robert" <{n.c.p}@allyourbass.org.invalid> schreef in bericht
news:slrnd125r8.1fl.robert@home.allyourbass.org...
> Passero <yanongena@pandora.be>:
>  > Ik zoek in java een systeem om een thread op te starten die het inlezen
>  > van serverberichten afhandelt. Het probleem is dat de lijn:
>  > in.readline(); waar in een BufferedReader is die gekoppeld is aan de
>  > Socket blijft wachten als de server niets stuurt maar ondertussen wil
ik
>  > wel andere dingen doen. Ik weet niet echt hoe ik dit moet oplossen. Dit
>  > is mijn thread: Ik weet niet wanner ik berichten van de server krijg of
>  > hoeveel het er zijn maar ondertussen moet ik ook op gelijk welk
tijdstip
>  > zelf berichten kunnen sturen naar de server.
>
> BufferedReader heeft een ready() method waarmee je kunt nagaan of er data
> in de buffer aanwezig is. Daarnaast zitten er in java.nio.channels een
> aantal mogelijkheden voor non-blocking I/O; voor socket-I/O kan je
> bijvoorbeeld eens kijken naar java.nio.channels.ServerSocketChannel
>
> Zie ook http://www-106.ibm.com/developerworks/library/j-perf03174.html
voor
> een voorbeeldje.
>
> --
>                                                                   robert

 ServerSocketChannel is voor servers maar ik schrijf een client. De methode
read lukt ook niet want dan stopt hij met uitvoeren wanneer er nog data moet
komen.
Re: [Java] vraagje ivm Threads
#1520
Author: Tjerk Wolterink
Date: Mon, 14 Feb 2005 23:13
47 lines
2767 bytes
Passero wrote:
> Ik zoek in java een systeem om een thread op te starten die het inlezen van
> serverberichten afhandelt. Het probleem is dat de lijn: in.readline(); waar
> in een BufferedReader is die gekoppeld is aan de Socket blijft wachten als
> de server niets stuurt maar ondertussen wil ik wel andere dingen doen. Ik
> weet niet echt hoe ik dit moet oplossen. Dit is mijn thread:
> Ik weet niet wanner ik berichten van de server krijg of hoeveel het er zijn
> maar ondertussen moet ik ook op gelijk welk tijdstip zelf berichten kunnen
> sturen naar de server.
> 
> public class SessieThread extends Thread
> {
>     private BufferedReader in;
> 
>     public SessieThread(BufferedReader in)
>     {
>         super("Sessie");
>         this.in = in;
>         run();
>     }
> 
>     public void run()
>     {
>         String bericht = "";
>         try
>         {
>             while (true)
>             {
>                 bericht = in.readLine();
>                 if (!bericht.equals(""))
>                     System.out.println(bericht);
>             }
>         }catch(Exception ex){ex.printStackTrace();}
>     }
> }
> 
> 
Ik snap het neit, je maakt toch al gebruik van een aparte thread die de berichten ontvangt?
niet?.  no maak van bericht een class-member (niet static) en maak twee methode
getLastRecievedMessage()
hasRecievedMEssage()

Of hang er een eigen gemaakte MEssageListener aan die telkens wordt aangeroepen als in.readline retourneerd.

Als je iets anders wilt doen tegelijkertijd met het ontvangen, dan maak je gebruik van threads.

Ik ga je verder niet helemaal een oplossing geven, dat moet je zelf doen
Re: [Java] vraagje ivm Threads
#1521
Author: robert
Date: Tue, 15 Feb 2005 08:49
20 lines
1947 bytes
Passero <yanongena@pandora.be>:
 > "robert" <{n.c.p}@allyourbass.org.invalid> schreef in bericht
 > news:slrnd125r8.1fl.robert@home.allyourbass.org...
 >>
 >> BufferedReader heeft een ready() method waarmee je kunt nagaan of er
 >> data in de buffer aanwezig is. Daarnaast zitten er in java.nio.channels
 >> een aantal mogelijkheden voor non-blocking I/O; voor socket-I/O kan je
 >> bijvoorbeeld eens kijken naar java.nio.channels.ServerSocketChannel
 >
 > ServerSocketChannel is voor servers maar ik schrijf een client.

Gelukkig bestaat er voor clients de SocketChannel class.

 > De methode read lukt ook niet want dan stopt hij met uitvoeren wanneer
 > er nog data moet komen.

Daar heb je dus ready() voor.

-- 
                                                                     robert
Re: [Java] vraagje ivm Threads
#1522
Author: Passero
Date: Tue, 15 Feb 2005 09:32
20 lines
2177 bytes
robert schreef:
> Passero <yanongena@pandora.be>:
>  > "robert" <{n.c.p}@allyourbass.org.invalid> schreef in bericht
>  > news:slrnd125r8.1fl.robert@home.allyourbass.org...
>  >>
>  >> BufferedReader heeft een ready() method waarmee je kunt nagaan of er
>  >> data in de buffer aanwezig is. Daarnaast zitten er in java.nio.channels
>  >> een aantal mogelijkheden voor non-blocking I/O; voor socket-I/O kan je
>  >> bijvoorbeeld eens kijken naar java.nio.channels.ServerSocketChannel
>  >
>  > ServerSocketChannel is voor servers maar ik schrijf een client.
> 
> Gelukkig bestaat er voor clients de SocketChannel class.
> 
>  > De methode read lukt ook niet want dan stopt hij met uitvoeren wanneer
>  > er nog data moet komen.
> 
> Daar heb je dus ready() voor.
> 
Ik bedoel dus ready h� ;)
Re: [Java] vraagje ivm Threads
#1524
Author: Passero
Date: Tue, 15 Feb 2005 11:23
25 lines
2031 bytes
Ik heb een "tijdelijke" oplossing gevonden die werkt maar blijkbaar 
vreet die processortijd. Ik heb de priority van de thread op min gezet 
omdat het anders niet doenbaar is. Is er een andere manier om het op te 
lossen?

public void run()
     {
         String bericht = "";
         try
         {
             while (true)
             {
                 if(in.ready())
                 {
                     bericht = in.readLine();
                     sessie.verwerkBericht(bericht);
                 }
                 else this.yield();
             }
         }catch(Exception ex){ex.printStackTrace();}
     }

Die "else this.yield();" zorgt ervoor dat de andere klassen tijd krijgen 
om hun ding te doen maar kvind het toch niet zo performant om eerlijk te 
zijn :s
Re: [Java] vraagje ivm Threads
#1523
Author: Daniel Tryba
Date: Tue, 15 Feb 2005 11:37
8 lines
1455 bytes
In nl.comp.programmeren Passero <yanongena@pandora.be> wrote:
> Ik heb een "tijdelijke" oplossing gevonden die werkt maar blijkbaar 
> vreet die processortijd. Ik heb de priority van de thread op min gezet 
> omdat het anders niet doenbaar is. Is er een andere manier om het op te 
> lossen?

Wat is nu precies het probleem indien de thread die de stream uitleest
blocked op de read?
Re: [Java] vraagje ivm Threads
#1526
Author: jAnO!
Date: Tue, 15 Feb 2005 21:26
48 lines
2599 bytes
"Passero" <yanongena@pandora.be> schreef in bericht 
news:w67Qd.11727$VT7.483449@phobos.telenet-ops.be...
> Ik zoek in java een systeem om een thread op te starten die het inlezen 
> van
> serverberichten afhandelt. Het probleem is dat de lijn: in.readline(); 
> waar
> in een BufferedReader is die gekoppeld is aan de Socket blijft wachten als
> de server niets stuurt maar ondertussen wil ik wel andere dingen doen. Ik
> weet niet echt hoe ik dit moet oplossen. Dit is mijn thread:
> Ik weet niet wanner ik berichten van de server krijg of hoeveel het er 
> zijn
> maar ondertussen moet ik ook op gelijk welk tijdstip zelf berichten kunnen
> sturen naar de server.
>
> public class SessieThread extends Thread
> {
>    private BufferedReader in;
>
>    public SessieThread(BufferedReader in)
>    {
>        super("Sessie");
>        this.in = in;
>        run();
>    }
>
>    public void run()
>    {
>        String bericht = "";
>        try
>        {
>            while (true)
>            {
>                bericht = in.readLine();
>                if (!bericht.equals(""))
>                    System.out.println(bericht);
>            }
>        }catch(Exception ex){ex.printStackTrace();}
>    }
> }
>
>
Ehhhmmm.... je start deze thread niet.... je roept alleen de run methode aan
in de constructor... tja dan runt ie niet als thread he? haal run(); uit de
contructor en start de thread zo:

Thread t = new SessieThread(in);
t.start();
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads