Synchroniser je le code 2 classes suivantes qui produisent ce résultat par exemple:Java Threads Problème
Wainting for calculation to complete...
Calculator thread says HELLO!
T1 says that total is 10
Wainting for calculation to complete...
Wainting for calculation to complete...
Maintenant threads attendent, mais personne ne va les informer. Comment puis-je forcer les threads de T1 à T3 à s'exécuter avant que le "thread de la calculatrice" ne s'éveille?
public class Calculator implements Runnable{
private int total;
public int getTotal() {
return total;
}
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
total += i;
}
System.out.println(Thread.currentThread().getName() + " says HELLO!");
notifyAll();
}
}
}
import static java.lang.System.out;
public class Reader implements Runnable{
private Calculator c;
public Reader(Calculator calc) {
c = calc;
}
public Calculator getCalculator() {
return c;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
Reader read = new Reader(calc);
Thread thread1 = new Thread(read);
Thread thread2 = new Thread(read);
Thread thread3 = new Thread(read);
thread1.setName("T1");
thread2.setName("T2");
thread3.setName("T3");
thread1.start();
thread2.start();
thread3.start();
Thread calcThread = new Thread(read.getCalculator());
calcThread.setName("Calculator thread");
calcThread.start();
}
}
@Override
public void run() {
synchronized (c) {
try {
out.println("Wainting for calculation to complete...");
c.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
out.println(Thread.currentThread().getName() + " says that " + "total is " + c.getTotal());
}
}
}
Je peux ajouter Thread.sleep() après le thread3.start() mais je considère que ce n'est pas une solution appropriée. – nyxz
Vous ne devriez jamais utiliser wait/notify, mais plutôt utiliser les utilitaires débogués de java.util.concurrent et entièrement repenser votre application en conséquence. Ce n'est pas clair quelle est votre vraie application, donc je ne peux pas vraiment vous dire ce que vous devriez utiliser. – toto2
@toto: Il n'y a aucune raison de ne pas utiliser wait/notify. Ce sont des primitives simples et elagent. Les classes java.util.concurrent ne sont que des wrappers sur le même. Je suis d'accord que des constructions de niveau supérieur telles que des verrous en lecture et en écriture, des barrières et des verrous sont offertes par ces classes. Mais vous ne devriez jamais vraiment utiliser une enclume quand un simple marteau suffirait. –