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.