| |||||
| Dernière réponse | ||
|---|---|---|
| Sujet : [JAVA] Probleme de surcharge CPU | ||
| Cherrytree |
|
|
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| Cherrytree |
|
| gfive | En java, c'est pas bill le plus fort, en tout cas, ça, c'est sûr!! :D |
| benou |
|
| Cherrytree |
|
| gfive | shit!! :D |
| axel5 | oui... mais la voila, j'ai pas la main sur le protocole client, faut donc faire avek ! :crazy: |
| gfive | Ah ouais...J'ai fait autrement, pour l'acquitement, moi....: comme j'en attend pas toujours, j'ai un système d'objects qui attendent : quand j'envoie un message pour lequel je dois attendre une réponse, je met mon objet qui attend dans une HashMap, indexé par l'Id du message....Quand un acquitement est reçu, je lis l'ID, et si un objet attend cet Id là, j'appelle la méthode à appeller quand l'Id est reçu.... |
| axel5 | gfive > le pb c'est que le client envoye des messages (on attend avec un receive donc bloquant) et on lui renvoie un aquittement, et on rempile sur le receive.... a coté de ca, on peut avoir a tt moment a lui envoyer des messages... avec un seul thread, on serait obligé d'attendre de recevoir un msg pour pourvoir renvoyer le notre apres aquittement... d'ou un second thread avec section critique |
| gfive | On a installé mardi, entre 2h et 7h!! :D
Et là, première rafale de corrections à faire!! :D Mais je bosse pas chez Orange, je bosse dans une p'tite boite qui bosse pour orange. |
| darklord22 | t'as bossé pour orange? |
| benou |
|
| gfive | Ouais, mais ça fait un an que je l'ai codé, ce bout là!! |
| darklord22 | damn!
benou :gun: :gun: :gun: :D bien vu :fou: |
| benou |
|
| gfive | Mais pourquoi tu veux pas écrire et écouter en même temps sur ta socket??? 8[ Pasque sinon, le bout de mon client qui marche nickel (c'est un bout du client du nouveau chat Orange!! :D (à voir là : chat.orange.fr) Le début : public Client(String ip, int port) throws IOException { socket = new Socket(ip, port); reader = new BufferedReader(new InputStreamReader(server.getInputStream())); writer = new PrintWriter(new OutputStreamWriter(server.getOutputStream()), true); thread = new Thread(this); thread.setPriority(Thread.NORM_PRIORITY); thread.start(); } la méthode run() public void run() { String line; while (thread != null) { try { if ((line = reader.readLine()) != null) { try { Message msg = MessageFactory.getMessage(line); msg.anwser(parent); } catch (MessageFormatException mfe) { // gestion... } } else { fireEvent(NetworkEvent.SERVERDIED); } } catch (IOException ioe) { fireEvent(NetworkEvent.SERVERDIED); } thread.yield(); } Et la méthode send : public void send(String msg) { writer.println(msg); writer.flush(); } } Côté serveur, c'est un peu plus complexe : l'objet ServerSocket instancie un objet Runnable pour gérer la Thread, mais le run et le send sont similaires à ceux là.... Effectivement, y'a un yield, là dedans!! :D |
| benou | nan yield ca rend le main, mais ca arrête pas le thread ...
ca laisse juste les autres thread s'excuter. ex : While (true) { Thread.yield(); } ca ce ne sera pas bloquant : les autres thread fonctionneront encore ! D'ailleur, je pense qu'avant de se mettre en pause, le sleep() appelle le yield() |
| darklord22 |
|
| benou |
|
| darklord22 |
|
| axel5 | ok merci, je vais voir tout ca...
pour ce qui est du thread, c'est la seule solution que j'ai trouvé, sachant que le thread parent gere la connection principale (d'ou le synchronized, histoire de ne pas send n'importe quand)... le pb c'est que je suis obligé de faire un appelle bloquant sur l'ecoute du client pour pouvoir detecter sa deconnection (et donc killer le process), mais en mm temps, il faut je puisse envoyer a cette mm connection des messages quand ils arrivent... voila le pourquoi du comment, j'espere que c'etait clair |
| darklord22 |
|
| benou | je persiste : si tu ne souhaite pas bloquer ton thread, fais un yield !
|
| darklord22 | Voila une solution qui fonctionne très bien chez moi.
D'une part tu as ton thread qui contient un vecteur v
|
| Rawhead rex | Tu pourrais peut-etre aussi gagner en bufferisant l'affichage plutot qu'effectuer un "System.out.println"(je crois que cette fonction ne rend pas la main au thread principal tant qu'elle n'a pas finit)
Tu devrais gagner en fluidite. |
| gfive | D'un autre côté, utiliser un Thread pour ça, ça me paraît douteux : utiliser un thread pour écouter une socket, d'accord, mais après...8|....je te suis pas! :D
Il sert à quoi, exactement, ton vecteur??? |
| benou | rajoute un Thread.yield() dans ta boucle : ca rend la main au système.
c'est indispensable. Le thread.sleep() fonctionne aussi mais endoer ton thread pdt le temps que tu as définie, ce qui n'est pas forcément ce que tu souhaites. |
| axel5 | voila en gros ce que fait le run() du thread:
while(m_stop == false) { if (m_answer.isEmpty() == false) { synchronized(m_parentJob) { String ans = (String)m_answer.firstElement(); System.out.println("Answer manager " + m_id + " > " + ans); outToClient.print(ans); m_answer.remove(ans); } } } m_answer est un vecteur, et outToClient... enfin c assez explicite :wahoo: |
| Cherrytree | Dans ton Thread, il faut absolument qu'à un moment donné tu fasses : Thread monThread; ... monThread.sleep(leTempsQueJeVeux); où leTempsQueJeVeux est un entier en millisecondes (à vérifier pour l'unité). |
| gfive | Un bout de code????? |
| axel5 | Bonjour
j'ai un probleme d'occupation cpu pour une application réseau. cette derniere crée un thread qui boucle à l'infini pour envoyer des messages qu'on lui donne... le probleme est que cette boucle entraine une utilisation maximale des ressources cpu, alors qu'on aimerait avoir un comportement plus proche d'un daemon, ou encore d'un procédé de callback comme pour les i/o... y-a-t-il une solution, spécifique java ou non ? |




