How to do a while without crashing the Java application

-1

I'm building an application in college that needs to run a code for 2 minutes and minute by minute make an assessment of the system and the variables that are in it. I've already searched the internet, some say to use new Thread() others to use new Runnable() , others to use the 2 forms and even then I get a solution.

I made an example with the minimum I need for my application to work, I just need to instantiate this class 2 times and the 2 can print any content on the console at the same time.

package teste;

public class Log {

    public boolean parar;

    public Log(String n) {

        SimpleDateFormat f = new SimpleDateFormat("ss");
        parar = false;

        int dTest, dNow = Integer.parseInt(f.format(Calendar.getInstance().getTime()));

        while (!parar) {

            dTest = Integer.parseInt(f.format(Calendar.getInstance().getTime()));

            if (dNow != dTest) {
                dNow = dTest;
                System.out.println(dNow + " | " + n);
            }

        }

    }

}

public class Teste {

    public static void main(String[] args) {

        System.out.println("teste de classe (1 para o sistema)");

        Log foo = new Log("foo"), bar = new Log("bar");

        Scanner scan = new Scanner(System.in);

        while (scan.nextInt() != 1) {
            System.out.println("------");
        }

        Runtime.getRuntime().exit(0);

    }

}

What is the best way to do this (or at least one that runs the 2 instances and my system stays open and can read this as a real-time read)?

    
asked by anonymous 26.03.2018 / 19:46

1 answer

2

First, here's a XY problem :

  

I'm building an application in college that needs to run a code for 2 minutes and minute-by-minute make an evaluation of the system and the variables that are in it.

This is problem X, which is what you need to solve.

  

I made an example with the minimum I need for my application to work, I just need to instantiate this class 2 times and the 2 can print any content on the console at the same time.

That's the Y problem, something you think might solve the problem, but you do not know exactly how or why.

I'll figure out a solution to your X problem:

public class Avaliador {

    private Avaliador() {
        throw new UnsupportedOperationException();
    }

    public static void avaliar(
            Trabalho trabalho,
            int intervalo)
    {
        Runnable r = () -> {
            while (!trabalho.terminou()) {
                System.out.println(trabalho.getStatus());
                try {
                    Thread.sleep(intervalo * 1000);
                } catch (InterruptedException e) {
                    break;
                }
            }
            System.out.println(trabalho.getStatus());
        };
        Thread t = new Thread(r);
        t.start();
    }
}
public interface Trabalho {
    public boolean terminou();
    public String getStatus();
}
public class TrabalhoPesado implements Trabalho {

    private final String nome;
    private final int tamanho;
    private final Thread trabalhador;
    private volatile int tempoQuePassou;

    private TrabalhoPesado(String nome, int tamanho) {
        this.nome = nome;
        this.tamanho = tamanho;
        this.trabalhador = new Thread(this::trabalhar);
    }

    private void trabalhar() {
        while (tempoQuePassou < tamanho) {
            try {
                tempoQuePassou++;
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
        }
    }

    public static TrabalhoPesado novoTrabalho(String nome, int tamanho) {
        TrabalhoPesado tp = new TrabalhoPesado(nome, tamanho);
        tp.trabalhador.start();
        return tp;
    }

    @Override
    public boolean terminou() {
        return !trabalhador.isAlive();
    }

    @Override
    public String getStatus() {
        return "Trabalho: " + nome + ". Tempo que passou: " + tempoQuePassou + ". Terminou: " + terminou();
    }
}
public class Teste {
    public static void main(String[] args) {
        Trabalho t1 = TrabalhoPesado.novoTrabalho("Azul", 120);
        Avaliador.avaliar(t1, 10);
        Trabalho t2 = TrabalhoPesado.novoTrabalho("Verde", 60);
        Avaliador.avaliar(t2, 1);
    }
}

Leave this program running for two minutes and it will produce this output (or something like that, output lines of different jobs done at the same time may appear in different orders):

Trabalho: Azul. Tempo que passou: 1. Terminou: false
Trabalho: Verde. Tempo que passou: 1. Terminou: false
Trabalho: Verde. Tempo que passou: 2. Terminou: false
Trabalho: Verde. Tempo que passou: 3. Terminou: false
Trabalho: Verde. Tempo que passou: 4. Terminou: false
Trabalho: Verde. Tempo que passou: 5. Terminou: false
Trabalho: Verde. Tempo que passou: 6. Terminou: false
Trabalho: Verde. Tempo que passou: 7. Terminou: false
Trabalho: Verde. Tempo que passou: 8. Terminou: false
Trabalho: Verde. Tempo que passou: 9. Terminou: false
Trabalho: Verde. Tempo que passou: 10. Terminou: false
Trabalho: Azul. Tempo que passou: 10. Terminou: false
Trabalho: Verde. Tempo que passou: 11. Terminou: false
Trabalho: Verde. Tempo que passou: 12. Terminou: false
Trabalho: Verde. Tempo que passou: 13. Terminou: false
Trabalho: Verde. Tempo que passou: 14. Terminou: false
Trabalho: Verde. Tempo que passou: 15. Terminou: false
Trabalho: Verde. Tempo que passou: 16. Terminou: false
Trabalho: Verde. Tempo que passou: 17. Terminou: false
Trabalho: Verde. Tempo que passou: 18. Terminou: false
Trabalho: Verde. Tempo que passou: 19. Terminou: false
Trabalho: Verde. Tempo que passou: 20. Terminou: false
Trabalho: Azul. Tempo que passou: 20. Terminou: false
Trabalho: Verde. Tempo que passou: 21. Terminou: false
Trabalho: Verde. Tempo que passou: 22. Terminou: false
Trabalho: Verde. Tempo que passou: 23. Terminou: false
Trabalho: Verde. Tempo que passou: 24. Terminou: false
Trabalho: Verde. Tempo que passou: 25. Terminou: false
Trabalho: Verde. Tempo que passou: 26. Terminou: false
Trabalho: Verde. Tempo que passou: 27. Terminou: false
Trabalho: Verde. Tempo que passou: 28. Terminou: false
Trabalho: Verde. Tempo que passou: 29. Terminou: false
Trabalho: Verde. Tempo que passou: 30. Terminou: false
Trabalho: Azul. Tempo que passou: 30. Terminou: false
Trabalho: Verde. Tempo que passou: 31. Terminou: false
Trabalho: Verde. Tempo que passou: 32. Terminou: false
Trabalho: Verde. Tempo que passou: 33. Terminou: false
Trabalho: Verde. Tempo que passou: 34. Terminou: false
Trabalho: Verde. Tempo que passou: 35. Terminou: false
Trabalho: Verde. Tempo que passou: 36. Terminou: false
Trabalho: Verde. Tempo que passou: 37. Terminou: false
Trabalho: Verde. Tempo que passou: 38. Terminou: false
Trabalho: Verde. Tempo que passou: 39. Terminou: false
Trabalho: Verde. Tempo que passou: 40. Terminou: false
Trabalho: Azul. Tempo que passou: 40. Terminou: false
Trabalho: Verde. Tempo que passou: 41. Terminou: false
Trabalho: Verde. Tempo que passou: 42. Terminou: false
Trabalho: Verde. Tempo que passou: 43. Terminou: false
Trabalho: Verde. Tempo que passou: 44. Terminou: false
Trabalho: Verde. Tempo que passou: 45. Terminou: false
Trabalho: Verde. Tempo que passou: 46. Terminou: false
Trabalho: Verde. Tempo que passou: 47. Terminou: false
Trabalho: Verde. Tempo que passou: 48. Terminou: false
Trabalho: Verde. Tempo que passou: 49. Terminou: false
Trabalho: Verde. Tempo que passou: 50. Terminou: false
Trabalho: Azul. Tempo que passou: 50. Terminou: false
Trabalho: Verde. Tempo que passou: 51. Terminou: false
Trabalho: Verde. Tempo que passou: 52. Terminou: false
Trabalho: Verde. Tempo que passou: 53. Terminou: false
Trabalho: Verde. Tempo que passou: 54. Terminou: false
Trabalho: Verde. Tempo que passou: 55. Terminou: false
Trabalho: Verde. Tempo que passou: 56. Terminou: false
Trabalho: Verde. Tempo que passou: 57. Terminou: false
Trabalho: Verde. Tempo que passou: 58. Terminou: false
Trabalho: Verde. Tempo que passou: 59. Terminou: false
Trabalho: Verde. Tempo que passou: 60. Terminou: false
Trabalho: Azul. Tempo que passou: 60. Terminou: false
Trabalho: Verde. Tempo que passou: 60. Terminou: true
Trabalho: Azul. Tempo que passou: 70. Terminou: false
Trabalho: Azul. Tempo que passou: 80. Terminou: false
Trabalho: Azul. Tempo que passou: 90. Terminou: false
Trabalho: Azul. Tempo que passou: 100. Terminou: false
Trabalho: Azul. Tempo que passou: 110. Terminou: false
Trabalho: Azul. Tempo que passou: 120. Terminou: false
Trabalho: Azul. Tempo que passou: 120. Terminou: true

Note that you can adjust the Avaliador numbers to set the frequency with which it checks the progress of the job. When he realizes that the job is over, he stops. You can run multiple jobs in parallel, each with its own independent appraiser.

The Trabalho interface specifies that a job must have a method to determine if it has already finished and one to give the status to be seen by Avaliador . The TrabalhoPesado implementation here does not do anything very important, but you'll probably use a different implementation of this interface.

    
26.03.2018 / 21:13