我希望你能帮助我,我在等待和通知方面遇到一些问题,因为当我这样做时我的应用程序不起作用,我不明白为什么。目标是 ApplicationMetier 检测软件是否已启动,如果该软件不存在,我们可以继续并执行executeTravauxSelectionnes
public void executeTravauxSelectionnes(String entreeUtilisateur) {
// Création d'un thread pour exécuter le logiciel métier
// attendre que le logiciel métier soit inactif
new Thread(() -> {
Optional<ProcessHandle> process = ProcessHandle.allProcesses().filter(p -> p.info().command().isPresent() && p.info().command().get().contains(propert.getProperty("softwarePath"))).findFirst();
if (!process.isPresent()) {
System.out.println("Le logiciel métier est inactif");
notify();
} else {
System.out.println("Le logiciel métier est actif");
try {
// attendre (wait)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//thread.sleep(1000);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
// Divise l'entrée de l'utilisateur en une liste de numéros de travaux
String[] travauxSelectionnes = entreeUtilisateur.split(",");
int nombreDeThreads = travauxSelectionnes.length;
ExecutorService executor = Executors.newFixedThreadPool(nombreDeThreads); // Création d'un pool de threads avec un nombre fixe de threads
// Parcours des numéros de travaux sélectionnés
for (String travail : travauxSelectionnes) {
// Si le numéro est un seul travail
if (travail.matches("\\d+")) {
int travailNumber = Integer.parseInt(travail.trim());
// Exécute le travail correspondant dans un thread séparé
executor.execute(() -> executeTravail(travailNumber));
}
// Si le numéro est une plage de travaux
else if (travail.matches("\\d+-\\d+")) {
String[] range = travail.split("-");
int start = Integer.parseInt(range[0].trim());
int end = Integer.parseInt(range[1].trim());
// Exécute les travaux dans la plage spécifiée dans des threads séparés
for (int i = start; i <= end; i++) {
int travailNumber = i;
executor.execute(() -> executeTravail(travailNumber));
}
}
// Si le numéro de travail n'est pas valide, ignorer
else {
System.out.println("Numéro de travail invalide: " + travail);
}
}
//création d'un thread qui met en pause le programme tant que le logiciel métier n'est pas fermé
// Fermeture du pool de threads une fois que toutes les tâches sont soumises à l'exécution
executor.shutdown(); // Fermeture du pool de threads une fois que toutes les tâches sont soumises à l'exécution
}
}
所以我做了一个新的编辑: 我观察到,当我这样做时,我在线上出现错误:wait();因为:当前线程不是所有者;我有一个类似计算器的应用程序,当它启动时,我想暂停“executeTravauxSelectionnes”
我在线出现错误:
,因为:“当前线程不是所有者”wait();
wait()
是一种 Object
方法。这是你对一个物体所做的事情。如果您只是写 wait();
那么您正在执行此操作的对象就是 this
对象。写入 wait();
与调用 this.wait();
相同
发生错误是因为
this.wait()
只能在 synchronized(this){...}
块内或在 synchronized
方法内使用。
话虽这么说,
wait()
和notify()
和notifyAll()
属于线程之间信号传递的非常低级别的机制,并且它仅意味着以非常特定的方式使用。我强烈建议您在尝试在自己的项目中使用它们之前先完成官方教程:
https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html