Sincronização Thread

3 respostas
gcoltrobarbosa

Boa tarde Pessoal!

Estou com dificuldade em fazer sincronização com 2 Threads.
Criei um programa que cria um objeto Robot, e faz com que o mouse fique se movimentando pela tela, porém, gostaria de fazer com que, ao apertar a tecla "ESC", o programa pare. Para isso, dividi as funções em 2 Threads, conforme abaixo:
[list]Thread 1 - Criação do Objeto Robot, e acionamento do método mouseMove();[/list]
[list]Thread 2 - Implementação da Interface KeyListener em um JFrame invisível;[/list]

Entretanto, a sincronização entre as 2 Threads não está funcionando.
Se alguém puder me ajudar, segue o código abaixo:

//Thread 1
import java.awt.*;
import java.awt.event.*;

class TestThread1 extends Thread{
	
	public void run(){
		try{
			Robot robot = new Robot();
			int x, y;
			for(x=0; x<1280; x++){
				for(y=0;y<1024;y++){
					//TestThread1.sleep(1);
					robot.mouseMove(x,y);
				}
			}
		}
		catch(AWTException e){
			System.err.println("Erro ao Criar o Robô");
		}
	}
}
//Thread 2
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TestThread2 extends Thread implements KeyListener{
	
	JFrame frame=new JFrame();

	public void run(){
		frame.addKeyListener(this);
		//this.setPriority(10);
	}
	
	public void keyPressed(KeyEvent e){
		switch (e.getKeyCode()){
			case KeyEvent.VK_ESCAPE:
				System.exit(0);
		}
	}

	public void keyReleased(KeyEvent e){}

	public void keyTyped(KeyEvent e){}
}
class TesteThread extends Thread{
	
	public static void main(String[] args){
		TestThread1 testeThread1=new TestThread1();
		TestThread2 testeThread2=new TestThread2();
		
		testeThread2.start();
		testeThread1.start();
	}
}

3 Respostas

ViniGodoy

Que sincronização? Uma das threads cria um Frame, cria um listener e morre.

A outra cria um Robot, que move o mouse de maneira super rápida, e depois disso morre também.

Não há variáveis compartilhadas entre as threads.

ViniGodoy

Sua falha está no conceito do que é uma thread. Thread não é um objeto, nem uma classe que estende thread. Thread é a linha de execução do programa, criada quando se chama o start.

No caso, a linha de execução da thread que inicia em TestThread2 só roda isso aqui:

public void run(){ frame.addKeyListener(this); }

Ou seja, a thread simplesmente pega um frame já criado na main thread, adiciona nele um listener e, ao terminar o método run, morre.

O keyPressed não é processado nessa thread, e sim na thread do Swing, que é quem dispara eventos.

gcoltrobarbosa

Neste caso, o que eu posso fazer para que, ao apertar uma tecla, pare o Robot, e termine a execução do programa? :frowning:

Criado 23 de março de 2013
Ultima resposta 23 de mar. de 2013
Respostas 3
Participantes 2