6
votes

Arrêtez un processus de course via GUI, en Java

J'ai un programme d'interface graphique qui exécute des scripts d'automatisation de test. Il est destiné aux utilisateurs de configurer facilement certains paramètres et de lancer le script d'automatisation qu'ils souhaitent.

Une chose que je dois ajouter est la possibilité d'arrêter instantanément le processus de test de course. Quelque chose comme comment en éclipse, le bouton "Terminer" s'arrêtera instantanément tout ce qui est en cours d'exécution. P>

C'est ce que le code qui lance les tests de test semble: P>

ExecutorService executorService = Executors.newFixedThreadPool(10);

public void runScript() {
    executorService.execute(this);
}

//this method gets called when I click the "stop" button
public void stopRun() {
    executorService.shutdownNow();
}

@Override
public void run() {
    //same stuff as from earlier code
}


13 commentaires

Système.exit (0); mettra fin à la JVM instantanément


@OluCode Oui, mais cela ne tue-t-il pas aussi ma demande d'interface graphique? J'ai besoin d'un moyen de tuer l'objet de test de course.


Si c'est un thread, utilisez un gestionnaire de threads comme exécutetorservice pour gérer la durée de vie du fil pour vous et appelez ServiceObject.Shutdownow ();


Pourquoi ne pas enregistrer le fil Testner en dehors de la exécuter () la périmètre et terminez-la d'une autre méthode?


@OluceCode merci, mais cela ne semble pas fonctionner. Le shutdownow (); ne fait que l'arrêt de la chose immédiate que l'objet Testng est en train de faire (par exemple, si l'objet doit exécuter 10 tests chacun dans un navigateur séparé, appeler Shutdownow () n'arrête que 1 test à la fois)


@CeilingGecko qui semble intéressant, pourriez-vous élaborer un peu plus s'il vous plaît?


Où placez-vous le threadmanager?


@Oluce j'ai modifié ma question pour montrer le nouveau code que j'essaie avec le service d'exécution


10 signifie votre 10 threads en cours ... est-ce ce que vous vouliez dire?


Je ne fais que tourner 1 thread (bien que l'objet Testg crée de nombreux threads pendant sa durée de vie). J'ai essayé avec seulement 1 et avec 50 (pour le diable de celui-ci), et le résultat était le même.


Yeah Coz Les 10 vont courir jusqu'à 10 threads à un point à un point basé sur le nombre de threads soumis à l'aide de la méthode de soumission de ExecuTelservice


Si votre classe de test commence à démarrer un autre thread, cela continuera à fonctionner si vous arrêtez votre fil SCRIPTRUNNER.


Juste l'ouvrir dans un nouveau fil;) et pour arrêter le programme tuer le fil


7 Réponses :


3
votes

SPAWN Un processus JVM enfant à l'aide de ProcessBuilder ou d'exécution et vous pourrez mettre fin à ce processus lorsque l'utilisateur demande que le script s'arrête en cours d'exécution.


0 commentaires

1
votes

Enregistrez tous les processus créés et tuez-les lorsque votre programme se termine:

public class ProcessFactory {
  private static Set<Process> processes = new HashSet<>();
  private static boolean isRunning = true;

  public static synchronized Process createProcess(...) throws ... {
    if (!isRunning)
      throw ...
    ... // create your spawned process
    processes.add(process);
    return process;
  }

  public static synchronized void killAll() {
    isRunning = false;
    for (Process p : processes)
        p.destroy();
    processes.clear();
  }

  public static void registerShutdownHook() {
      Runtime.getRuntime().addShutdownHook(new Thread() {
         void run() {
             killAll();
         }
      });
  }
}


0 commentaires

2
votes

Vous pouvez utiliser ExecuTertorservice pour lancer l'exécution des tests dans un autre fil. Vous pouvez choisir de disposer de nombreux fils en parallèles ou moins d'un thread pour tous les tests de séquence en choisissant quel service exécuteur dont vous avez besoin.

Après cela, lancez l'exécution de tous les tests de la même instance de service exécuteur en appelant la méthode Soumettre (). Vous pouvez arrêter l'exécution de tous les runnables soumis en appelant la méthode shutdownow ().

Il est important d'utiliser la même instance d'exécuteurService, sinon vous démarrez chaque test dans un fil différent et vous ne permettez pas de casser la chaîne d'exécution (ou en appelant shutdownow () sur tous).


0 commentaires

1
votes

qu'en est-il de cela, Ajouter un booléen statique volatil et faire ressembler le code de thread ... xxx pré>

Vous pouvez ajouter un bouton dans votre interface graphique principale qui définit simplement le runthread code> sur false Donc, le fil se termine presque instantané en laissant tout le code restes intact lorsque vous appuyez sur la touche Stop CODE>. P>

public class ScriptRunner implements Runnable {

    volatile static Boolean runThread = true;

    public void runScript() {
        Thread testRun = new Thread(this);
        testRun.start();
    }

    public void terminate(){
        runThread = false;
    }

    @Override
    public void run() {
        //various other things are configured for this, 
        //but they're not relevant so I left them out
        TestNG tng = new TestNG();

        //While this runs, various browser windows are open, 
        //and it could take several minutes for it all to finish
        tng.run();
    }
}


0 commentaires

1
votes

Que diriez-vous d'un nouveau fil? Vous devez ajouter un thread de fil privé; code> dans l'interface graphique et lorsque vous démarrez

thread = new thread(){
    @Override
    public void run(){
       //start process here
    }
};
thread.start();


0 commentaires

1
votes

Dans votre interface graphique quelque part, vous avez quelque chose comme xxx

lorsque vous souhaitez arrêter appeler xxx

modifie le code dans scriptrunner < / p> xxx


0 commentaires