Boa noite, estou montando uma interface. Nela há um botão start que inicia uma Thread e transforma-se em botão stop (não na thread). Até aí, tudo bem, mas se eu aperto o botão consecutivamente (criando um start/stop/start/stop) ele acaba criando uma nova thread antes de parar a anterior, assim, fico com uma thread rodando extra e uma manuseável de acordo com o start/stop (é possível aumentar o número de threads prolongado o número de vezes que pressiona-se o botão).
Já tentei criar um método synchronizad, usar booleans e tudo mais que eu consegui imaginar pra tentar corrigir isso (impedir a criação de mais de 1 thread), mas nada dá certo…
Meu código:
package snow;
import java.io.IOException;
import javax.swing.JOptionPane;
/**
* @author KaL
*/
public class Listeners
{
private Sniffer sn;
private GUI gui;
private ProcessList pl;
private PIDsHandler ph;
private int pid = -1;
private String recv, send;
private boolean isRefreshing = false;
public Listeners( GUI gui)
{
this.gui = gui;
pl = new ProcessList();
ph = new PIDsHandler(this.gui);;
}
private boolean load()
{
try{
int avaliablePID = pl.listProcessIDs()[0];
if(!ph.isPID(avaliablePID))
return false;
String process = pl.getPIDProcess(avaliablePID);
if(ProcessList.interrupted && !isRefreshing)
{
ProcessList.isProcessing = false;
return false;
}
if(process == null && !isRefreshing)
if(!ph.isProcess(process))
return false;
recv = pl.getPIDRecv(process);
send = pl.getPIDSend(process);
ph.addUsedPID(avaliablePID);
setPID(avaliablePID);
ProcessList.isProcessing = false;
return true;
} catch (IOException e) {
gui.showOptionPane("Could not search for avaliable processes.", "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
return false;
}
}
public void start()
{
new Thread()
{
public void run()
{
if(getPID() < 0)
{
if(!load())
{
if(!ProcessList.interrupted)
gui.startInvert();
}
}
if(ProcessList.interrupted)
{
ProcessList.interrupted = false;
return;
}
getGUI().refresh.setEnabled(true);
sn = new Sniffer(recv, send, gui);
setSniffer(sn);
getSniffer().isRunning = true;
getSniffer().run();
}
}.start();
}
public void stop(boolean disable)
{
if(isRefreshing && disable)
gui.start.setEnabled(false);
if(ProcessList.isProcessing)
pl.interrupt();
if(getSniffer() != null && getSniffer().isRunning)
getSniffer().stopSniff();
}
public void setSniffer(Sniffer sn)
{
this.sn = sn;
}
public Sniffer getSniffer()
{
return sn;
}
public void setPID(int PID)
{
pid = PID;
}
public int getPID()
{
return pid;
}
public GUI getGUI()
{
return gui;
}
}