PDA

View Full Version : [JAVA] problema THREAD in GIOCO help urgente


alvise_91
22-12-2008, 12:22
ciao a tutti ragazzi! premetto che sono nuovo di quì, sono passato un sacco di volte e o trovato info sempre utili... ora vi posto il mio problema che da una settimana non riesco a risolvere.

o creato un piccolo giochetto, praticamente la classe del gioco 'MemoRally.java' che estende un JFrame attraverso un Thread esterno fa girare un scpecie di macchinetta. prima di questo però c'è la classe Game.java che fa sciegliere all'utente tutte le impostazioni. allora quando mettevo io i parametri per MemoRally andava tutto bene e funzionava..ora pero che li passo attraverso Game.java non so come si blocca sul thread e non fa nulla. ovvero il thread gira ma punto. posto tutto il codice di Game.java e MemoRally.java. grazie a chi mi aiuta =)

PS: prima che vi leggiate il codice volevo dire che sono in 4^a ad un itis e quindi tutte queste cose me le imparo da solo quindi se il codice è scritto male scusatemi. sono aperto a tutti i consigli.



"MemoRally.java"
import java.awt.*;
import javax.imageio.*;
import javax.swing.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.geom.*;
import java.lang.*;
import java.util.*;

public class MemoRally extends JFrame implements ActionListener {


int x;
int y;
double statoV;
double statoD;
double velocitaMax;
double velocitaMin;
double attrito;
double incrementoV;
double incrementoD;
double direzione;
double velocita;
String[] vett;

Boolean iniziabile = false;

Image imgSfnd;
Image imgCar;

public MemoRally (String[] vettore) {
super("MemoRally");
iniziabile = false;
this.vett = vettore;
//System.out.println("vett: " + vett);
x = Integer.parseInt(vett[8]);
y = Integer.parseInt(vett[9]);
direzione = Integer.parseInt(vett[10]);
velocita = 0;
statoV = 0;
statoD = 0;
velocitaMax = 20;
velocitaMin = -2;
attrito = 3;
incrementoV = 0.5;
incrementoD = 10;
System.out.println("*********************" + vett[7]);
System.out.println("*********************" + vett[6]);
try{
imgSfnd = ImageIO.read(new File("circuito1.jpg"));
imgCar = ImageIO.read(new File(vett[6]));
}
catch(Exception e)
{
System.out.println("failed");
}

addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
System.out.println("RELEASED: " + e.getKeyCode());
if (e.getKeyCode()==Integer.parseInt(vett[1])) {
aggiornaV("stop");
}
if (e.getKeyCode()==Integer.parseInt(vett[2])) {
aggiornaV("stop");
}
if (e.getKeyCode()==Integer.parseInt(vett[3])) {
aggiornaD("stop");
}
if (e.getKeyCode()==Integer.parseInt(vett[4])) {
aggiornaD("stop");
}
}
public void keyPressed(KeyEvent e) {
//aggiornaTutto();
System.out.println("PRESSED: " + e.getKeyCode());
if (e.getKeyCode()==Integer.parseInt(vett[1])) {
aggiornaV("accelera");
}
if (e.getKeyCode()==Integer.parseInt(vett[2])) {
aggiornaV("frena");
}
if (e.getKeyCode()==Integer.parseInt(vett[3])) {
aggiornaD("sinistra");
}
if (e.getKeyCode()==Integer.parseInt(vett[4])) {
aggiornaD("destra");
}
if (e.getKeyCode()==Integer.parseInt(vett[5])) {
direzione = 0;
velocita = 0;
x = 200;
y = 200;
}
}
public void keyTyped(KeyEvent e) {
System.out.println("TYPED: " + e.getKeyCode());
}
});

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(20, 20);
setSize(new Dimension(1024,768));
setResizable(false);
setVisible(true);

iniziabile = true;

Thred aggiorna = new Thred(500, this);
aggiorna.run();
}


public void actionPerformed(ActionEvent e) {

}

public Boolean partibile () {
return iniziabile;
}


public void aggiornaTutto () {
System.out.println("STATO V: " + statoV + " STATO D: " + statoD);
if (statoV == 0) {
if (velocita > 0) {
velocita = velocita - attrito;
if (velocita < 0) {
velocita = 0;
}
} else if (velocita < 0) {
velocita = velocita + attrito;
if (velocita > 0) {
velocita = 0;
}
}
} else {
velocita = velocita + (incrementoV * statoV);
}
if (velocita > velocitaMax) {
velocita = velocitaMax;
} else if (velocita < velocitaMin) {
velocita = velocitaMin;
}
direzione = direzione + (incrementoD * statoD);
if (direzione > 360) {
direzione = direzione - 360;
} else if (direzione < 360) {
direzione = direzione + 360;
}
}

public void aggiornaV (String m) {
String s;
s = m;
if ( s== "accelera") {
statoV = 1;
} else if ( s== "frena") {
statoV = -1;
} else if ( s== "stop") {
statoV = 0;
}
//aggiornaTutto();

}

public void aggiornaD (String s) {
if ( s== "destra") {
statoD = 1;
} else if ( s== "sinistra") {
statoD = -1;
} else if ( s== "stop") {
statoD = 0;
}
//aggiornaTutto();
}


public void calcolaPos (double d, double v) {
x = x + (int)(Math.cos(Math.toRadians(d - 90)) * v);
y = y + (int)(Math.sin(Math.toRadians(d - 90)) * v);
}



public void paint (Graphics g){
//System.out.println(img);
g.drawImage(imgSfnd, 0, 0, this);
Graphics2D g2d = (Graphics2D)g;
AffineTransform original = g2d.getTransform();
AffineTransform rotated = (AffineTransform)(original.clone());
int xRot = x + (imgCar.getWidth(this)/2);//this.getWidth()/2;
int yRot = y + (imgCar.getHeight(this)/2);//this.getHeight()/2;
rotated.rotate(Math.toRadians(direzione), xRot, yRot);
g2d.setTransform(rotated);
calcolaPos(direzione, velocita);
g2d.drawImage(imgCar, x, y, this);
g2d.setTransform(original);
/*System.out.println("X" + x);
System.out.println("Y" + y);
System.out.println("DIREZIONE" + direzione);
System.out.println("VELOCITA" + velocita);*/
//g.drawImage(imgCar, x, y, this);
}
}

class Thred extends Thread{
private int sleeppo;
MemoRally test;

public Thred(int millisec, MemoRally prova){
sleeppo = millisec;
test = prova;
}

public void run(){
try{
while(true){
//System.out.println("Lo scrivo ogni " + (sleeppo/1000) +" secondi");
test.aggiornaTutto();
test.repaint();
sleep(sleeppo);
}
}
catch(InterruptedException e){
System.out.println("Thread bloccato");
}
}
}



"Game.java"

import java.awt.*;
import javax.imageio.*;
import javax.swing.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.geom.*;
import java.lang.*;
import java.util.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.event.*;

public class Game extends JFrame implements ActionListener {

JPanel infoPlayer;
JPanel infoTrack;
JPanel infoListaTrack;
JPanel infoListaPlayer;
JPanel bottoni;
JList listaPlayer;
JList listaTrack;
JButton selCircuito = new JButton("Seleziona Circuito");
JButton selPlayer = new JButton("Seleziona Giocatore");


JLabel[] datiPlayer;
JLabel nomeTracciato;
JSlider numeroDiGiri;
JLabel immiTracciato;
String[] vettoreGiocatoriPath;
String[] vettoreGiocatoriString;
String[] vettoreTrackPath;
String[] vettoreTrackString;
String[] informazioniCircuito;

public MemoRally istanzaDiGioco;

FileFilter jpgFilter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg");
private String scanPath;
JFileChooser directoryOpen;
int tasto = 0;
JFrame pannello;
JLabel numeroDiGiriMostra;
JFrame nuovoPlayer;

public Game () {
super("MemoRally");
this.getContentPane().setLayout(new FlowLayout());//GridLayout(2,2,30,50));
JPanel informazioni = new JPanel();
informazioni.setLayout(new GridLayout(2,1));

infoPlayer = new JPanel();
infoPlayer.add(preparaPnlPlayer());
infoPlayer.setBackground(Color.GREEN);
infoPlayer.setSize(700,256);

infoTrack = new JPanel();
infoTrack.add(preparaPnlTrack());
infoTrack.setBackground(Color.RED);
infoTrack.setSize(700,256);

infoListaPlayer = new JPanel();
infoListaPlayer.add(preparaPnlListaPlayer());
infoListaPlayer.setBackground(Color.RED);
infoListaPlayer.setSize(324,512);

infoListaTrack = new JPanel();
infoListaTrack.add(preparaPnlListaTrack());
infoListaTrack.setBackground(Color.GREEN);
infoListaTrack.setSize(700,256);

bottoni = new JPanel();
bottoni.add(preparaPnlBottoni());
bottoni.setBackground(Color.GREEN);
bottoni.setSize(324,256);

informazioni.add(infoPlayer);
informazioni.add(infoTrack);
informazioni.setSize(700,512);




this.getContentPane().add(informazioni, BorderLayout.WEST);
this.getContentPane().add(infoListaPlayer);
this.getContentPane().add(infoListaTrack);
this.getContentPane().add(bottoni);
//this.getContentPane().add(infoTrack);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(20, 20);
setSize(new Dimension(1024,768));
setResizable(false);
//pack();
setVisible(true);
}


private JPanel preparaPnlPlayer () {
JPanel p = new JPanel();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
p.setLayout( new FlowLayout());
p.setSize(700,256);
p1.setLayout( new GridLayout(7,2));
p1.add(new JLabel("Informazioni GIOCATORE"));
p1.add(new JLabel(" "));
p1.add(new JLabel("Nome : "));

datiPlayer = new JLabel[7];
for (int i = 0; i < 7; i++){
datiPlayer[i] = new JLabel(" --- ");
}

p1.add(datiPlayer[0]);
JButton accelera = new JButton("Accelera");
accelera.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
lettureDeiTasti(1);
}});
p1.add(accelera);
p1.add(datiPlayer[1]);
JButton frena = new JButton("Frena");
frena.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
lettureDeiTasti(2);
}});
p1.add(frena);
p1.add(datiPlayer[2]);
JButton sinistra = new JButton("Sinistra");
sinistra.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
lettureDeiTasti(3);
}});
p1.add(sinistra);
p1.add(datiPlayer[3]);
JButton destra = new JButton("Destra");
destra.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
lettureDeiTasti(4);
}});
p1.add(destra);
p1.add(datiPlayer[4]);
JButton pausa = new JButton("Pausa");
pausa.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
lettureDeiTasti(5);
}});
p1.add(pausa);
p1.add(datiPlayer[5]);
p2.setLayout( new GridLayout(2,1));
JButton scegliMacchina = new JButton("Carica Macchina");
scegliMacchina.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
scegliMacchina();
}});
p2.add(scegliMacchina);
p2.add(datiPlayer[6]);




/*p1.add(datiPlayer[]);
p1.add(new JButton("Frena"));
p1.add(datiPlayer[]);
p1.add(new JButton("Sinistra"));
p1.add(datiPlayer[]);
p1.add(new JButton("Destra"));
p1.add(datiPlayer[]);
p1.add(new JButton("Pausa"));
p1.add(datiPlayer[]);*/

p.add(p1);
p.add(p2);
return p;
}

private JPanel preparaPnlBottoni () {
JPanel p = new JPanel();
p.setSize(324,256);
JButton selezionaCircuito = new JButton("Seleziona il circuito");
selezionaCircuito.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
selezionaCircuito();
}});
p.add(selezionaCircuito);
JButton selezionaGiocatore = new JButton("Seleziona il giocatore");
selezionaGiocatore.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
selezionaGiocatore();
}});
p.add(selezionaGiocatore);
JButton gioca = new JButton("Gioca!");
gioca.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
gioca();
}});
p.add(gioca);
return p;
}

private JPanel preparaPnlTrack () {
JPanel p = new JPanel();
p.setSize(700,256);
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
p.setLayout( new FlowLayout());
p1.setLayout( new GridLayout(3,2));
//p3.setLayout( new FlowLayout());
p1.add(new JLabel("Informazioni TRACCIATO"));
p1.add(new JLabel(" "));
p1.add(new JLabel("Nome : "));

nomeTracciato = new JLabel(" ---- ");
p1.add(nomeTracciato);

p1.add(new JLabel("Numero di giri : "));
numeroDiGiriMostra = new JLabel();
numeroDiGiri = new JSlider(JSlider.HORIZONTAL, 1, 100, 3);
numeroDiGiri.setMajorTickSpacing(2);
numeroDiGiri.addChangeListener( new ChangeListener () {
public void stateChanged ( ChangeEvent t) {
numeroDiGiriMostra.setText(Integer.toString(numeroDiGiri.getValue()));
}
});
p3.add(numeroDiGiri);
numeroDiGiriMostra.setText(Integer.toString(numeroDiGiri.getValue()));
p3.add(numeroDiGiriMostra);
p1.add(p3);
p2.add(new JLabel("Immagine : "));
immiTracciato = new JLabel(" ---- ");
p2.add(immiTracciato);
p.add(p1);
p.add(p2);
return p;
}

private JPanel preparaPnlListaPlayer () {
JPanel p = new JPanel();
JPanel p2 = new JPanel();
p.setLayout( new GridLayout(2,1));
p.setSize(324,500);
p2.setSize(324,80);
JButton aggiungiPlayer = new JButton("Aggiungi un giocatore");
aggiungiPlayer.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
aggiungiPlayer();
}});
JButton salvaPlayer = new JButton("Salva il giocatore");
salvaPlayer.addActionListener( new ActionListener () {
public void actionPerformed(ActionEvent e) {
salvaPlayer();
}});
preparaVettorePlayer();
listaPlayer = new JList(vettoreGiocatoriString);
listaPlayer.setSize(324,420);
JScrollPane scrollaGiocatori = new JScrollPane(listaPlayer);
scrollaGiocatori.setSize(324,420);

p2.add(aggiungiPlayer);
p2.add(salvaPlayer);
p.add(p2);
p.add(scrollaGiocatori);
return p;
}

private JPanel preparaPnlListaTrack () {
JPanel p = new JPanel();
p.setSize(700,256);
preparaVettoreTrack();
listaTrack = new JList(vettoreTrackString);
listaTrack.setSize(700,256);
JScrollPane scrollaTrack = new JScrollPane(listaTrack);
scrollaTrack.setSize(700,256);
p.add(scrollaTrack);
return p;
}

public void actionPerformed(ActionEvent e) {
}

public void selezionaCircuito () {
if (listaTrack.getSelectedIndex()>= 0){
ArrayList tempString = new ArrayList();
try {
File fileInput = new File(vettoreTrackPath[listaTrack.getSelectedIndex()]);
FileReader input = new FileReader(fileInput.getAbsolutePath());
int temp = input.read();
String ris = "";
while ( temp != - 1 ) {
if ((temp >= 48) && (temp <= 57)) {
while (temp != 120) {
ris = ris + Character.toString((char)temp);
temp = input.read();
}
tempString.add(ris);
ris = "";
}
temp = input.read();
}
} catch (FileNotFoundException e1) {
System.out.println();
} catch (IOException e2) {
e2.printStackTrace();
}
System.out.println(tempString);
nomeTracciato.setText(vettoreTrackString[listaTrack.getSelectedIndex()]);
informazioniCircuito = new String[tempString.size()];
for (int i = 0; i < informazioniCircuito.length; i++){
informazioniCircuito[i] = (String)tempString.get(i);
System.out.println("info circuito " + informazioniCircuito[i]);
}
}
}

public void selezionaGiocatore () {
if (listaPlayer.getSelectedIndex()>= 0){
ArrayList tempString = new ArrayList();
try {
File fileInput = new File(vettoreGiocatoriPath[listaPlayer.getSelectedIndex()]);
FileReader input = new FileReader(fileInput.getAbsolutePath());
int temp = input.read();
String ris = "";
while ( temp != - 1 ) {
if (((temp >= 48) && (temp <= 57)) || ((temp >= 65) && (temp <= 90)) || ((temp >= 97) && (temp <= 122))) {
while (temp != 126) {
ris = ris + Character.toString((char)temp);
temp = input.read();
//System.out.println(ris);
}
tempString.add(ris);
ris = "";
}
temp = input.read();
}
} catch (FileNotFoundException e1) {
System.out.println();
} catch (IOException e2) {
e2.printStackTrace();
}
//System.out.println(tempString);
datiPlayer[0].setText(vettoreGiocatoriString[listaPlayer.getSelectedIndex()]);
for (int i = 1; i < 7; i++){
datiPlayer[i].setText((String)tempString.get(i - 1));
}
}
}
public void salvaPlayer () {
Boolean ris = true;
for (int i =0; i < 7; i++){
if (datiPlayer[i].getText() == " --- ") {
ris = false;
}
}
if (ris) {
try {
PrintWriter fout = new PrintWriter(new FileWriter("giocatori/" + datiPlayer[0].getText()));
for (int i = 1; i < 7; i++){
fout.println(datiPlayer[i].getText() + "~");
}
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
JOptionPane.showConfirmDialog(null, " Inserire tutti i dati prima!", "salva giocatore",JOptionPane.YES_OPTION);
}
}

public void preparaVettorePlayer () {
File cartellaPlayer = new File ("giocatori/");
File[] l = cartellaPlayer.listFiles();
ArrayList vettoreGiocatori = new ArrayList();
for (int i = 0; i < l.length; i++){
if (l[i].getAbsolutePath().substring(l[i].getAbsolutePath().length()-3).equals("txt")) {
vettoreGiocatori.add(l[i].getAbsolutePath());
}
}
vettoreGiocatoriString = new String[vettoreGiocatori.size()];
vettoreGiocatoriPath = new String[vettoreGiocatori.size()];
int lunghezza = vettoreGiocatori.size();
String appoggioString;
for (int i = 0; i < lunghezza; i++){
appoggioString = (String)vettoreGiocatori.get(i);
vettoreGiocatoriString[i] = appoggioString.substring(appoggioString.lastIndexOf("\\")+1);
vettoreGiocatoriPath[i] = appoggioString;
}
}

public void preparaVettoreTrack () {
File cartellaTrack = new File ("tracciati/");
File[] l = cartellaTrack.listFiles();
ArrayList vettoreTrack = new ArrayList();
for (int i = 0; i < l.length; i++){
if (l[i].getAbsolutePath().substring(l[i].getAbsolutePath().length()-3).equals("txt")) {
vettoreTrack.add(l[i].getAbsolutePath());
}
}
vettoreTrackString = new String[vettoreTrack.size()];
vettoreTrackPath = new String[vettoreTrack.size()];
int lunghezza = vettoreTrack.size();
String appoggioString;
for (int i = 0; i < lunghezza; i++){
appoggioString = (String)vettoreTrack.get(i);
vettoreTrackString[i] = appoggioString.substring(appoggioString.lastIndexOf("\\")+1);
vettoreTrackPath[i] = appoggioString;
}
}

public void leggiTastoDaOption () {
pannello = new JFrame("Lettura Tasto");
JButton oro = new JButton("Ok");
pannello.setLayout( new FlowLayout());
oro.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if (tasto > 0) {
datiPlayer[tasto].setText(Integer.toString(e.getKeyCode()));
pannello.setVisible(false);
tasto = 0;
}
}
public void keyTyped(KeyEvent e) {
}
});
pannello.add(oro);
pannello.setSize(100,100);
pannello.setLocation(500,400);
pannello.setVisible(true);
}

/* public void accelera () {
tasto = 1;
leggiTastoDaOption();
}
public void frena () {
tasto = 2;
leggiTastoDaOption();
}
public void sinistra () {
tasto = 3;
leggiTastoDaOption();
}
public void destra () {
tasto = 4;
leggiTastoDaOption();
}*/
public void lettureDeiTasti (int n) {
tasto = n;
leggiTastoDaOption();
}
public void scegliMacchina () {
directoryOpen = new JFileChooser(new File("Game.java"));
directoryOpen.setFileFilter(jpgFilter);
directoryOpen.setFileSelectionMode(JFileChooser.FILES_ONLY);
int approva = directoryOpen.showOpenDialog(null);
if (approva == JFileChooser.APPROVE_OPTION) {
File x = directoryOpen.getSelectedFile();
scanPath = x.getAbsolutePath();
}
datiPlayer[6].setText(scanPath);
}

public void aggiungiPlayer () {
String nomeTemporaneo;
do {
nomeTemporaneo = JOptionPane.showInputDialog("Nome: ", null);
} while (nomeTemporaneo.length()<=1);
try {
PrintWriter fout = new PrintWriter(new FileWriter("giocatori/" + nomeTemporaneo + ".txt"));
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
preparaVettorePlayer ();
listaPlayer.setListData(vettoreGiocatoriString);
}
public void gioca () {
String[] infoTotali = new String[7 + informazioniCircuito.length];

for (int i = 0; i < 7; i++) {
infoTotali[i] = datiPlayer[i].getText();
}
System.out.println(informazioniCircuito[3]);
infoTotali[7] = vettoreTrackPath[listaTrack.getSelectedIndex()];
for (int i = 8; i < informazioniCircuito.length + 7; i++) {
System.out.println(infoTotali[i] + " ----- " + informazioniCircuito[i-8]);
infoTotali[i] = informazioniCircuito[i - 8];
System.out.println(i - 8);
System.out.println(i);
System.out.println(infoTotali[i] + " ----- " + informazioniCircuito[i-8]);
}
for (int i = 0; i < infoTotali.length; i++){
System.out.println("i " + i + " info " + infoTotali[i]);
}
//this.setVisible(false);
//System.out.println("vett: " + infoTotali);
this.dispose();
MemoRally istanzaDiGioco = new MemoRally(infoTotali);
//System.out.println("3" + istanzaDiGioco.partibile());
//Thred aggiorna = new Thred(50, this); //, istanzaDiGioco);
//aggiorna.run();
}

public void aggiornaQualche () {
System.out.println("3" + istanzaDiGioco.partibile());
if (istanzaDiGioco.partibile()) {
istanzaDiGioco.aggiornaTutto();
istanzaDiGioco.repaint();
}
}

public static void main (String[] arg) {
Game test = new Game();
}
}

alvise_91
22-12-2008, 16:04
dai raga x favore qualche aiuto??

fero86
22-12-2008, 18:04
eh, ma sto codice é troppo lungo figliuolo ^^
ho capito che é Natale ma nessuno é cosi tanto buono da mettersi a fare il debug di quell'affarone : D

non ho letto il codice ma posso darti qualche indicazione mooolto generale:

1) controlla lo standard error: puó darsi che il programma ti abbia lanciato qualche eccezione che non hai visto, e quindi un thread del programma é crashato mentre gli altri, pur potendo continuare a lavorare, sono rimasti fermi in attesa di qualcosa che doveva fare il primo.

2) se non ci sono eccezioni é probabile che tu sia vittima di un deadlock: usa un debugger per vedere, dei threads che girano, quali sono in attesa su qualche oggetto, e cerca di capire se un sottoinsieme di essi formano un ciclo di attese. se non sai cos'é un deadlock se vuoi ti spiego.

alvise_91
22-12-2008, 18:12
si grazie degli aiuti. il primo lo escludo perchè gestisco tutte le eccezzioni. comunque si se puoi spiegami perchè io per "debug" uso solo il compilatore di JAVA lanciato da JCreator =) tutto a mano.. e siccome del multy-threading non so tanto (anzi praticamente nulla se non le basi) mi saresti di grande aiuto.

cmq volevo specificare che il programma non si blocca, continua a girare come 'ignorando' il metodi del file MermoRally.java.

comunque capisco benissimo che sia lungo.. mi ci perdo pure io a volte.. :muro:

alvise_91
22-12-2008, 22:39
comunque ci tengo a precisare che non riusciendo a risolvere il problema l'ho aggirato. ovvero o creato un file *.bat che lancio da dentro "Game.Java". arrivato a quando devo far partire la nuova classe "MemoRally.java" salvo i dati occorrenti su un file temporaneo, chiamo l'esecuzione del bat e faccio un

System.exit(0);

nel bat poi metto un ritardo di mezzo secondo (per far in modo che SICURAMENTE l'applicazione java venga chiusa e poi avvio subito la classe MemoRally.java =)

fero86
23-12-2008, 23:40
si grazie degli aiuti. il primo lo escludo perchè gestisco tutte le eccezzioni. anche quelle unchecked? le eccezioni unchecked in genere non vanno gestite, ma vanno lasciate propagare perché indicano per definizione un bug del programma.


comunque si se puoi spiegami perchè io per "debug" uso solo il compilatore di JAVA lanciato da JCreator =) tutto a mano.. e siccome del multy-threading non so tanto (anzi praticamente nulla se non le basi) mi saresti di grande aiuto. un deadlock, anche detto attesa circolare, é una condizione in cui N threads attendono su altrettante risorse di sincronizzazione (oggetti nel caso di Java) senza la possibilitá che l'attesa termini; ció si verifica quando le attese sono circolari.

mi spiego meglio, numeriamo i threads da 1 a N e gli oggetti da 1 a N dando loro lo stesso numero dei thread che li hanno bloccati in un determinato momento: il thread 1 ha bloccato l'oggetto (la risorsa di sincronizzazione) 1, il thread 2 ha bloccato l'oggetto 2, e cosi via. ora mettiamo peró che il thread 1 voglia bloccare anche l'oggetto 2, il thread 2 l'oggetto 3, il thread 3 l'oggetto 4, e cosi via fino al thread N che vuole bloccare l'oggetto 1; quello che accade naturalmente é che nessuna attesa viene soddisfatta e gli N thread rimangono tutti bloccati.

nel caso piu semplice i thread in deadlock sono solo 2, quindi N = 2: ci sono due thread e due oggetti, l'oggetto 1 bloccato dal thread 1 e il 2 bloccato dal 2, ed il thread 1 attende sull'oggetto 2 mentre il thread 2 attende sull'oggetto 1; i due thread si bloccano.

questa situazione si chiama deadlock; ora devi vedere se c'entra qualcosa con quanto si verifica nel tuo programma. parlando in termini meno teorici "attendere su un oggetto" significa chiamare il metodo Object.wait(), mentre "bloccarlo" significa che l'attesa é terminata, il metodo wait ha finito la sua esecuzione e il monitor dell'oggetto appartiene al thread che ha chiamato wait.

qui c'é la documentazione della classe Object e dei suoi metodi di sincronizzazione, se ancora non hai avuto occasione di vederla:
http://java.sun.com/javase/6/docs/api/index.html?java/lang/Object.html

anche se il tuo programma non funziona per tutt'altre ragioni, queste nozioni ti saranno comunque molto utili (si tratta di cose importanti).

ad ogni modo ribadisco il consiglio di usare un debugger: con quello puoi individuare molto facilmente un eventuale deadlock. non conosco JCreator perché uso tutt'altro, quindi non so darti indicazioni in merito.