[java] thread et sleep en ns

thread et sleep en ns [java] - Java - Programmation

Marsh Posté le 10-03-2004 à 17:23:14    

Salut !
 
Je travaille sur des applications de routage actif en java et pour faire des pauses j'utilise la méthode sleep() de Thread. D'après la doc java, on peux faire des pauses à la nanoseconde. D'après mes tests ce temps de pause est completement irréaliste vu qu'un sleep(0,1) (d'une nanoseconde) dure au moins 3 voire 5 milisecondes.
Avez-vous déjà essayé ces sleep à la nanoseconde ? Qu'en pensez vous ?
 
Merci d'avance.


---------------
-@- When code matters more than commercials -@-
Reply

Marsh Posté le 10-03-2004 à 17:23:14   

Reply

Marsh Posté le 10-03-2004 à 17:26:47    

manu025 a écrit :

Salut !
 
Je travaille sur des applications de routage actif en java et pour faire des pauses j'utilise la méthode sleep() de Thread. D'après la doc java, on peux faire des pauses à la nanoseconde. D'après mes tests ce temps de pause est completement irréaliste vu qu'un sleep(0,1) (d'une nanoseconde) dure au moins 3 voire 5 milisecondes.
Avez-vous déjà essayé ces sleep à la nanoseconde ? Qu'en pensez vous ?
 
Merci d'avance.


 
du ns en java je trouve cela difficilement realisable, enfin, je peux me tromper ;)

Reply

Marsh Posté le 10-03-2004 à 17:29:39    

c'est pas une source officielle, mais ca me parat logique :  
http://www.talkaboutprogramming.co [...] 16031.html


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-03-2004 à 17:32:23    

ça dépend aussi du système sous-jacent.
 
tu veux pas faire un yield plutot ?

Reply

Marsh Posté le 10-03-2004 à 17:34:31    

Taz a écrit :


tu veux pas faire un yield plutot ?


ca a pas du tout le même usage ... yield rend la main, sleep fait une pause


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-03-2004 à 18:00:00    

certes, mais tu crois qu'il se passe quoi quand on fais un sleep ? moi je vois bien un autre thread prendre la main. je n'ai rien testé, mais peut être que yield est la manière la plus rapide de faire une petite pause.

Reply

Marsh Posté le 10-03-2004 à 18:08:00    

Taz a écrit :

je n'ai rien testé, mais peut être que yield est la manière la plus rapide de faire une petite pause.


c'est détourner l'utilisation du yield [:skeye]
 
dans ce cas, y a qu'à faire un for (int i=0;i<100; i++){}, ca fait une petite pause aussi [:kiki]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-03-2004 à 18:16:29    

faudrait faire un essai, mais pourquoi pas  
 
juste avec un petit test, une boucle avec 1000 Thread.sleep(1) prends 22000ms chez moi et 1000 Thread.yield() prend 10000ms

Reply

Marsh Posté le 10-03-2004 à 18:31:49    

Taz a écrit :

faudrait faire un essai, mais pourquoi pas


parce que c'est n'importe quoi ?
parce que dans 10 ans ta pause durera 100 fois moins longtemps ?


Message édité par benou le 10-03-2004 à 18:32:02

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-03-2004 à 18:34:23    

non. parce que c'est la seule façon que j'ai trouvé de faire une pause aussi courte que possible.

Reply

Marsh Posté le 10-03-2004 à 18:34:23   

Reply

Marsh Posté le 10-03-2004 à 20:06:56    

Ouais c'est donc bien bidon la pause de 1ns, ils sont un peu arrangés chez Sun quand même...
Pour le coup du yield j'y avais pensé, le seul pb c'est que dans le programme que j'utilise, la classe Thread est overloadée et ya plus de yield :/ D'ailleurs je me demande comment ils ont bien pu faire ça.
Et la boule ça ne va pas car ça boufferait tout le cpu et les autres threads ne pourraient pas s'exécuter correctement.


---------------
-@- When code matters more than commercials -@-
Reply

Marsh Posté le 10-03-2004 à 20:09:29    

je comprends pas là...

Reply

Marsh Posté le 10-03-2004 à 21:02:07    

de quoi ?

Reply

Marsh Posté le 10-03-2004 à 21:13:48    

comment cai possible

Reply

Marsh Posté le 10-03-2004 à 21:31:11    

Taz a écrit :

comment cai possible


Code :
  1. public class ThreadALaCon extends Thread {
  2.    public void yield() {
  3.       System.out.println("dtc" );
  4.    }
  5. }


[:spamafote]

Reply

Marsh Posté le 10-03-2004 à 21:32:25    

manu025 a écrit :

Ouais c'est donc bien bidon la pause de 1ns


dans le cas où l'OS sous jacent est capable de le gérer, ca va marcher ...
 
Sun a rien à voir la dedans ... c'est l'OS qui est pas capable ...

Reply

Marsh Posté le 10-03-2004 à 21:36:33    

benou a écrit :


Code :
  1. public class ThreadALaCon extends Thread {
  2.    public void yield() {
  3.       System.out.println("dtc" );
  4.    }
  5. }


[:spamafote]


 
 

Code :
  1. public class ThreadEncorePlusALaCon extends ThreadALaCon {
  2.    public void yield() {
  3.       super.super.yield();
  4.    }
  5. }


 [:fez666]  
 
 

Reply

Marsh Posté le 10-03-2004 à 21:37:10    

benou a écrit :


Code :
  1. public class ThreadALaCon extends Thread {
  2.    public void yield() {
  3.       System.out.println("dtc" );
  4.    }
  5. }


[:spamafote]

et dans ce cas c'est pas possible de faire un Thread.yield() ?

Reply

Marsh Posté le 10-03-2004 à 21:38:12    

benou a écrit :


dans le cas où l'OS sous jacent est capable de le gérer, ca va marcher ...
 
Sun a rien à voir la dedans ... c'est l'OS qui est pas capable ...

sur ? faudrait pouvoir voir comment la machine de Sun ordonnance ses threads

Reply

Marsh Posté le 10-03-2004 à 21:38:29    

SquiZZ a écrit :


Code :
  1. public class ThreadEncorePlusALaCon extends ThreadALaCon {
  2.    public void yield() {
  3.       super.super.yield();
  4.    }
  5. }


 [:fez666]  


tu peux pas faire super.super [:spamafote]

Reply

Marsh Posté le 10-03-2004 à 21:39:36    

benou a écrit :


tu peux pas faire super.super [:spamafote]


 
c'était juste au cas ou, super c'est un des seuls trucs dont je me rappelle en java  [:shinji_kun64]

Reply

Marsh Posté le 10-03-2004 à 21:40:09    

mais ((Thread)this).yield() :D

Reply

Marsh Posté le 10-03-2004 à 21:54:12    

Taz a écrit :

mais ((Thread)this).yield() :D


jolie StackOverflowError :jap:

Reply

Marsh Posté le 10-03-2004 à 21:56:03    

SquiZZ a écrit :


c'était juste au cas ou, super c'est un des seuls trucs dont je me rappelle en java  [:shinji_kun64]  


en java y a pas moyen de squizzer (:)) l'implémentation parente d'une classe pour remonter à l'implémentation "grand-parente" [:spamafote]

Reply

Marsh Posté le 10-03-2004 à 21:56:15    

tu peux m'expliquer ? et me dire pourquoi le Thread.yield() ne marcherait pas ?

Reply

Marsh Posté le 10-03-2004 à 21:58:25    

Taz a écrit :

tu peux m'expliquer ? et me dire pourquoi le Thread.yield() ne marcherait pas ?


[:gratgrat]
 
oups ... t'as raison, j'avais oublié que le yield était static  :whistle:  
 
quel con [:ddr555]

Reply

Marsh Posté le 10-03-2004 à 22:18:01    

je dois être bête mais je vois pas du tout en quoi le fait que cette méthode soit static change quelque chose dans l'histoire.
Le code de taz marche très bien en C++, peux tu m'expliquer pourquoi il ne marcherait pas en java et dans ce cas quel est l'effet magique du static ?
 
 
 
> benou :  [:aloy] jeu de mots !  [:ddr555]  

Reply

Marsh Posté le 10-03-2004 à 22:25:39    

ben c'est juste que c'est une méthode de classe, pas d'instance, donc elle est toujours accessible de n'importe où : tu peux pas la surcharger. Le code de Taz par contre ne marche pas dans le cas où tu redéfinies une méthodes statique yield parce qu'il passe par this pour l'appeler.  
C'est possible d'appeler une méthode static comme une méthode de normal (this.laMethode), mais dans ce cas, ce sera la 1ere méthode de ce nom (dans l'arborescence d'héritage des classes) qui sera appelée.
 
=> ((Thread) this).yield() -> ca revient au même que this.yield(). D'ailleur, si c'est à l'intérieur de yield que tu fais ca ca compile pas puisque yield est static => pas de this
=> Thread.yield -> ca marche

Reply

Marsh Posté le 10-03-2004 à 23:01:25    

Je vais regarder plus en détail le code de l'appli en question et je vous redirais. En tout cas le Thread.yield() ne marche pas.

Reply

Marsh Posté le 10-03-2004 à 23:03:19    

bizzare ça :/

Reply

Marsh Posté le 10-03-2004 à 23:11:26    

manu025 a écrit :

En tout cas le Thread.yield() ne marche pas.


qu'est ce qui te fait dire ca ?

Reply

Marsh Posté le 10-03-2004 à 23:12:55    

Taz a écrit :

mais ((Thread)this).yield() :D

http://supergrass.densitron.net/diary4/paris/sortie.JPG


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 10-03-2004 à 23:27:10    

donc si j'ai bien tout compris, on ne peut transtyper que des types de base et pas des objets ?
 

Reply

Marsh Posté le 10-03-2004 à 23:29:14    

SquiZZ a écrit :

donc si j'ai bien tout compris, on ne peut transtyper que des types de base et pas des objets ?


 :heink:  
 
absolument rien à voir

Reply

Marsh Posté le 10-03-2004 à 23:57:44    

ok, je comprendrais jamais rien à java.
 
Quand je caste un truc, je m'attends a retrouver un objet casté de l'autre côté et pas une référence sur l'instance d'objet non castée. (enfin c'est comme ca que j'interprète ce qui se passe, je dois me planter complètement).
 
avec une classe de base CBaseClass et une classe dérivée CDerivedClass
 
si je fais  

Code :
  1. CDerivedClass d = new CDerivedClass();
  2. CBaseClass b = (CBaseClass)d;


 
quand j'appelle une méthode de b, j'aimerais bien appeler des méthodes de la classe CBaseClass.
Sinon je vois pas trop a quoi ca sert de caster, et donc pourquoi cette syntaxe est acceptée par un compilo.
 
 
edit :
si je fais  

Code :
  1. float toto = 5.6f;
  2. int titi = (int)toto;


 
j'espère que me retrouve pas avec un entier qui vaut 5.6


Message édité par SquiZZ le 11-03-2004 à 00:06:48
Reply

Marsh Posté le 11-03-2004 à 08:55:58    

un cast sur des types primitifs et sur des objets, déjà c'est pas pareil. Sur des types primitifs c'est une conversion... Sur des objets c'est juste une indication au compilateur.
 
 

SquiZZ a écrit :

si je fais  

Code :
  1. CDerivedClass d = new CDerivedClass();
  2. CBaseClass b = (CBaseClass)d;


 
quand j'appelle une méthode de b, j'aimerais bien appeler des méthodes de la classe CBaseClass.


ben effectuvement t'as rien compris : c'est contraire au polymorphisme ce que tu dis ... peut importe la déclaration du type d'un objet : quand tu appelles une émthode dessus, c'est la méthode du type REEL de l'instance de l'objet qui sera appelée ...
 
et ton cast dans ton exemple au dessus il sert à rien : tu pourrais ne pas le mettre ca ferait pareil

Reply

Marsh Posté le 11-03-2004 à 09:12:53    

benou a écrit :

un cast sur des types primitifs et sur des objets, déjà c'est pas pareil.  


c'est ce que je disais qques messages avant et tu m'a fait  :heink:  
 

benou a écrit :


ben effectuvement t'as rien compris : c'est contraire au polymorphisme ce que tu dis ... peut importe la déclaration du type d'un objet : quand tu appelles une émthode dessus, c'est la méthode du type REEL de l'instance de l'objet qui sera appelée ...


du polymorphisme j'en fait tous les jours en C++.
seulement en C++ quand je dis à mon gentil compilo de caster, il caste.
c'est pas forcément propre au niveau OO mais ca peut servir de temps en temps.
Un genre de super en mieux (ou moins bien ca dépend de quel côté on se place)
donc le super de java est contraire au polymorphisme ?
 

benou a écrit :


et ton cast dans ton exemple au dessus il sert à rien : tu pourrais ne pas le mettre ca ferait pareil


 
Je sais aussi que mon cast ne sert a rien, c'était juste pour montrer au lecteur que je veux caster.
Je repose ma question : à quoi ca sert d'avoir l'opérateur de cast sur les objets dans un langage si il ne sert a rien ?


Message édité par SquiZZ le 11-03-2004 à 09:13:43
Reply

Marsh Posté le 11-03-2004 à 09:23:11    

SquiZZ a écrit :


c'est ce que je disais qques messages avant et tu m'a fait  :heink:  
 
 
du polymorphisme j'en fait tous les jours en C++.
seulement en C++ quand je dis à mon gentil compilo de caster, il caste.

on caste peut en C++ en POO par ce que les convertions sont implicites   Sous -> Super[:spamafote] . par contre on utilise le dynamic_cast dans certaines situations sur Super -> Sous

Reply

Marsh Posté le 11-03-2004 à 09:27:05    

vive le C++, à bas le java  [:ddr555]  
bon, après tout c'est juste une différence d'approche java/c++.
allez faut que j'aille au boulot.
 

Reply

Marsh Posté le 11-03-2004 à 09:31:02    

SquiZZ a écrit :

Je repose ma question : à quoi ca sert d'avoir l'opérateur de cast sur les objets dans un langage si il ne sert a rien ?


parce que des gens sont un peu plus ouvert d'esprit et comprennent pas à quoi il sert ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed