wait()和notify()java

问题描述 投票:0回答:1

我希望你能帮助我,我在等待和通知方面遇到一些问题,因为当我这样做时我的应用程序不起作用,我不明白为什么。目标是 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”

java multithreading thread-safety
1个回答
0
投票

我在线出现错误:

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

© www.soinside.com 2019 - 2024. All rights reserved.