Bonjour,
J'ai vu pas mal de code ressemblant à ceci sur internet et il est vrai que j'ai toujours fait comme ça:
Peut-il y avoir des problèmes de concurrences/synchronisation?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Test { public void method1() { Thread t = new Thread("exemple"){ @Override public void run() { ... method2(); } }; t.start(); } public void method2() { ... } }
Si la method2() effectue des modifications sur des variables et que le run() du Thread t est plus complexe (il fait pleins de traitements et appelle plusieurs fois method2() le tout dans une boucle par exemple).
Que va-t-il se passer lorsque l'on utilisera la méthode method2() depuis une instance de Test? Ou si on touche aux variables qui sont modifié dans method2() alors que le Thread t tourne (et fait des modifications constamment)?
Autres questions:
D'après la doc java, une instance d'une classe interne ne peux vivre qu'à l'intérieur d'une instance de la classe de base (voir "inner classes" http://docs.oracle.com/javase/tutori...OO/nested.html). Qu'en est-il pour un Thread? Est-ce que le Thread t subsistera si l'instance de Test est détruite?
Autres exemples:
Si entre le .add() et le .pop() du Thread, la méthode method2() est appelé, il y aura une erreur sur le .pop(). Comment gérer ça?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public class Test2 { public final LinkedList<String> queue = new LinkedList<String>() public void method1() { Thread t = new Thread("exemple"){ @Override public void run() { ... queue.add("test"); ... queue.pop(); ... } }; t.start(); } public void method2() { ... queue.clear(); ... } }
Merci d'avance pour vos réponses :-)
Partager