Por que meu ‘Sout ok’ do método run não e exibido na tela do console?
package Principal;
import java.awt.Canvas;
import java.awt.Dimension;
import javax.swing.JFrame;
public class Game extends Canvas implements Runnable{
// Variaveis!
public JFrame frame;
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
private Thread thread;
private boolean isRunning=true;
// Metodo Construtor!
public Game(){
initFrame();
}
//Metodo Comum!
public void initFrame(){
frame = new JFrame();
frame.add(this);
frame.setPreferredSize(new Dimension(WIDTH,HEIGHT));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public synchronized void start(){
thread = new Thread(this);
isRunning = true;
}
public synchronized void stop(){
}
public static void main(String[] args) {
Game game = new Game();
game.start();
}
public void tick(){
}
public void render(){
}
@Override
public void run() {
System.out.println("OK");
}
}
Quando você cria uma Thread como você fez, ela começa no estado NEW e não é agendada para execução. Uma forma de fazer isso é chamar o método start() no objeto da Thread: a JVM vai agendar essa thread para execução, movendo-a pro estado RUNNABLE e vai chamar o método run dela pra você. No caso, como o seu objeto foi construído usando um Runnable, o run da Thread acaba invocando o run do seu Runnable, fazendo então o seu print. Dá uma lida nos javadocs das classes Thread e da classe Thread.State, tem bastante informação útil lá. O material mais fantástico q já li sobre isso foi o livro Java Concurrency in Practice.
Um exemplo:
public class Main {
public static void main(String[] args) {
Task myTask = new Task();
Thread t = new Thread(myTask);
t.start();
}
}
class Task implements Runnable {
@Override
public void run() {
System.out.println("Hello, World!");
}
}
Uma sugestão: quando for colar código aqui pra o pessoal te ajudar, tenta enxugar o exemplo o máximo possível. Tem um monte de coisa nesse código q não tem nada a ver com o problema. Se você enxugar o exemplo, vai ficar bem mais fácil de alguém te ajudar!