Partage
  • Partager sur Facebook
  • Partager sur Twitter

La première fonction qui fini arrête l'autre ?

Thread

    26 avril 2015 à 17:55:59

    Bonjour à tous,

    J'ai un algo qui me calcule plus ou moins rapidement une solution pour un problème, cet algo fonctionne bien. Maintenant ce que j'aimerai faire c'est indiqué un délai à ne pas dépassez pour cette algo, si le délai est dépassé l'algo s’arrête brutalement, sinon l'algo se termine normalement et renvoie le temps d’exécution par rapport à ce délai.

    On m'a conseillé d'utilisé les Threads, je connais peu le sujet et je n'ai aucune idée de comment faire. Y'a t'il quelqu'un qui a une idée en tête s'il vous plaît ?
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2015 à 18:14:43

      Bonjour.

      Le problème avec les Thread c'est que pour le stopper cela est assez fastidieux : généralement on utilise un boolean qui permet de sortir d'une boucle.

      L'autre solution est d'utiliser ExecutorService : tu lui donnes une action à exécuter, un timeout, et tu gères l'exception :

      class TonAction implements Callable<String> {
          @Override
          public String call() throws Exception {
              System.out.println("Action started...");
              Thread.sleep(1_000);
              System.out.println("1sec...");
              Thread.sleep(1_000);
              System.out.println("2sec...");
              Thread.sleep(1_000);
              System.out.println("3sec...");
              return "Action finished!";
          }
      }
      ExecutorService executor = Executors.newSingleThreadExecutor();
      Future<String> future = executor.submit(new TonAction());
      
      try {
          System.out.println("Before get");
          String result = future.get(4, TimeUnit.SECONDS);
          System.out.println("Result: " + result);
          System.out.println("After get");
      } catch (TimeoutException e) {
          System.out.println("TimeoutException");
      }
      
      System.out.println("Shutdown!");
      executor.shutdownNow();
      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        26 avril 2015 à 18:22:02

        Merci pour ta réponse Pinguet, mon algo est dans une classe que j’appelle depuis mon main, cela est il compatible avec ta solution ?
        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2015 à 18:40:47

          Je t'ai mis la trame : à toi de l'adapter selon tes besoins.

          Le plus instructif serait d'étudier chacune des classes/méthodes/paramètres utilisées ici.

          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            26 avril 2015 à 18:48:25

            Ok, merci je vais essayer ça.
            • Partager sur Facebook
            • Partager sur Twitter
              26 avril 2015 à 19:14:21

              J'ai essayé et du coup sa me dit bien que ma fonction n'as pas résolu à temps, mais par contre l'algo n'est pas arrêté, il tourne toujours.
              • Partager sur Facebook
              • Partager sur Twitter
                26 avril 2015 à 19:28:38

                Il y executor.shutdownNow(); à faire à la fin sinon ça continue.
                • Partager sur Facebook
                • Partager sur Twitter
                Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                  26 avril 2015 à 19:39:04

                  Oui il est bien à la fin, mais ça tourne toujours.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 avril 2015 à 17:24:09

                    Chez moi mon exemple fonctionne correctement. (au début j'avais le même problème car j'avais oublié le "shutdownNow", mais avec aucun soucis)
                    Tu peux vérifier, en faisant varier la durée de la tâche ou en provoquant le timeout.
                    Peut-êtres as-tu d'autres Threads qui sont lancés ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)

                    La première fonction qui fini arrête l'autre ?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown