Java threads

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!

2 curtidas

nossa cara resposta melhor que essa não acho em lugar nenhum do mundo obrigadão mesmo vou guardar bem essa resposta sua para vida inteira.:blue_heart::+1: