Salve,
ho un problema urgentissimo. Ho solo tempo fino a lunedì. Sono disperato. Ho creato un programma JAVA di cui vi scrivo di seguito i sorgenti. Quando premo sul pulsante conferma parte l'applicazione che genere all'infinito thread, ma l'intera interfaccia utente (realizzata con le awt) si "congela" e non riesco nemmeno a chiudere il JFrame. Sono in cerca di una soluzione.

public class Semaforo extends JPanel
{
private Image image,image1;
private boolean state=true;

public Semaforo()
{

image=Toolkit.getDefaultToolkit().getImage("tpa//green.jpg");
image1=Toolkit.getDefaultToolkit().getImage("tpa//red.jpg");
MediaTracker tracker=new MediaTracker(this);
tracker.addImage(image,0);
tracker.addImage(image1,1);
try{tracker.waitForID(0);
tracker.waitForID(1);}catch(InterruptedException e){

}
}

public void paintComponent(Graphics g) {


super.paintComponent(g);


if(state==true)
g.drawImage(image, 0, 0, null);
else
g.drawImage(image1,0,0,null);



}




public void setState(boolean state) {
Graphics g=getGraphics();
this.state = state;
paintComponent(g);
}

}
---------------------------------------------------------------------------------------
public class ParcheggioGUI extends JFrame implements ActionListener{
private JLabel ptot=new JLabel("Posti Totali");
private TextField ptotfield=new TextField(20);
private Button conferma=new Button("Conferma");
private JLabel pdisp=new JLabel("N° posti disponibili");
private TextField pdispfield=new TextField(5);
private Semaforo sem = new Semaforo();
private JLabel image=new JLabel(new ImageIcon("tpa//parcheggio.jpg"));
private TextArea cron=new TextArea(10,40);
public ParcheggioGUI(){

pdispfield.setEnabled(false);
this.setTitle("Display");
this.setSize(400,450);
this.setResizable(false);
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints gbc=new GridBagConstraints();
add(image,gbc,0,0,1,1);

add(ptot,gbc,0,1,1,1);
gbc.anchor=GridBagConstraints.WEST;
gbc.insets=new Insets(0,0,0,10);
add(ptotfield,gbc,1,1,1,1);

add(pdisp,gbc,0,2,1,1);
gbc.anchor=GridBagConstraints.CENTER;
gbc.insets=new Insets(10,0,0,0);
add(pdispfield,gbc,1,2,2,2);
gbc.anchor=GridBagConstraints.EAST;
add(conferma,gbc,3,1,1,1);
conferma.addActionListener(this);
gbc.anchor=GridBagConstraints.SOUTH;
gbc.fill=GridBagConstraints.BOTH;
gbc.ipady=20;
add(sem,gbc,3,2,1,1);

gbc.anchor=GridBagConstraints.SOUTH;
gbc.fill=GridBagConstraints.RELATIVE;
gbc.anchor=GridBagConstraints.SOUTH;
gbc.insets=new Insets(10,0,0,0);
add(cron,gbc,0,4,4,1);

}
public void add(Component c,GridBagConstraints gbc, int x, int y, int w, int h){
gbc.gridx=x;
gbc.gridy=y;

gbc.gridwidth=w;
gbc.gridheight=h;
this.getContentPane().add(c,gbc);
}

public void update(int numPosti, boolean state)
{
pdispfield.setText(""+numPosti);
sem.setState(state);
}


public JLabel getPtot(){
return ptot;
}
public TextField getPtotField(){
return ptotfield;
}
public JLabel getPdisp(){
return pdisp;
}
public TextField getPdispField(){
return pdispfield;
}
public Semaforo getSem(){
return sem;
}
public Button getConferma(){
return conferma;
}
public TextArea getCron(){
return cron;
}
public void actionPerformed(ActionEvent e){

ptotfield.setEnabled(false);
pdispfield.setEnabled(false);
int capienza=Integer.parseInt(ptotfield.getText());
if(capienza==0){
ptotfield.setEnabled(true);
JOptionPane.showMessageDialog(null,"Inserisci un intero > 0");
}
else{
ptotfield.setText("Parking for "+capienza+" vehicles");
Parcheggio p=new Parcheggio(capienza,this);


for(;{

int attesa=(int)(Math.random()*5000);
int azione=(int)(Math.random()*2);
String action="Entra";
if(azione==1 && p.getNumeroPosti()!=capienza)
action="Esce";
Thread t=new Thread(new Auto(action,p,this));
t.start();


try{
Thread.sleep(attesa);
}catch(InterruptedException a){
System.out.println(a.getMessage());
}
}
}
}
}
----------------------------------------------------------------------------------------
public class Auto extends Thread {
private String azione;
private Parcheggio p;
private ParcheggioGUI gui;
public Auto(String azione, Parcheggio p,ParcheggioGUI gui){
this.azione=azione;
this.p=p;
this.gui=gui;
}

public void run(){
//p.getNumeroPosti();

if(azione.compareTo("Entra")==0){
synchronized(p){
try{
p.AutoEntra();

p.getNumeroPosti();
}catch(ParcheggioFullException e){gui.getCron().append(""+e.getMessage()+"\n");
}
}
}
else{
synchronized(p){

p.AutoEsce();
p.getNumeroPosti();
}
}

}

}

----------------------------------------------------------------------------------------
public class main {

/**
* @param args
*/
public static void main(String[] args) {

// TODO Auto-generated method stub
ParcheggioGUI gui=new ParcheggioGUI();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
gui.show();
}
}

Grazie.