Hallo,
ich habe folgendes Problem.
Ich habe ein Applet, das mehrere Threads hat.
In einem Thread werden die Geschosse verwaltet.
Applet <--- Thread_Geschoss 1 <-- x Geschoss
Die Geschosse sind in der Klasse Thread_Geschosse in einer ArrayList <Geschoss> myBullits gespeichert.
Nun möchte ich, wenn das Geschoss eine bestimmte Bedingung erfüllt, dieses Geschoss löschen, da ja jede weitere Berechnung sinnlos Resourcen verbrauchen würde.
Dazu wird die ArrayList in Thread_Geschosse durchsucht und das Element gelöscht. jedes Geschoss hat einen eineindeutigen Index --> myIndex.
Leider hängt sich das Progrramm an dieser Stelle fast - und eben nur fast immer - auf. Meistens beim ersten Löschvorgang, manchmal aber auch erst beim zweiten.
Ich habe das Ganze auch schon so kodiert, dass das repaint() nur durch den Thread_Geschosse ausgelöste wird, NACHDEM das entsprechende Geschoss gelöscht wird. Das hat auch nicht funktioniert.
Für Lösunsgshinweise wäre ich dankbar.
Gruß
System.exit(0)
-----
Hier die Fehelrmeldung:
Hier die wichtigsten Codes.
ich habe folgendes Problem.
Ich habe ein Applet, das mehrere Threads hat.
In einem Thread werden die Geschosse verwaltet.
Applet <--- Thread_Geschoss 1 <-- x Geschoss
Die Geschosse sind in der Klasse Thread_Geschosse in einer ArrayList <Geschoss> myBullits gespeichert.
Nun möchte ich, wenn das Geschoss eine bestimmte Bedingung erfüllt, dieses Geschoss löschen, da ja jede weitere Berechnung sinnlos Resourcen verbrauchen würde.
Dazu wird die ArrayList in Thread_Geschosse durchsucht und das Element gelöscht. jedes Geschoss hat einen eineindeutigen Index --> myIndex.
Leider hängt sich das Progrramm an dieser Stelle fast - und eben nur fast immer - auf. Meistens beim ersten Löschvorgang, manchmal aber auch erst beim zweiten.
Ich habe das Ganze auch schon so kodiert, dass das repaint() nur durch den Thread_Geschosse ausgelöste wird, NACHDEM das entsprechende Geschoss gelöscht wird. Das hat auch nicht funktioniert.
Für Lösunsgshinweise wäre ich dankbar.
Gruß
System.exit(0)
-----
Hier die Fehelrmeldung:
Code:
Exception in thread "Thread-5" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at SPielVersuch.Thread_Geschoss.change_Pos(Thread_Geschoss.java:14)
at SPielVersuch.Thread_Geschoss.run(Thread_Geschoss.java:37)
BUILD SUCCESSFUL (total time: 8 seconds)
Hier die wichtigsten Codes.
Java:
public class Thread_Geschoss extends Thread
{
private ArrayList <Geschoss> myBullits;
private double Intervall = 0.04;
Thread_Geschoss ()
{
myBullits = new ArrayList <Geschoss> ();
}
public void change_Pos()
{
for (Geschoss G : myBullits)
{
G.compute(Intervall);
if (G.get_Y() > 500)
{
for (int i = 0; i < myBullits.size(); i ++)
{
if (G.get_myIndex() == myBullits.get(i).get_myIndex())
{
myBullits.remove(i);
break;
}
}
}
}
}
public void run()
{
while (true)
{
try {
Thread.sleep((long) (Intervall * 1000.0));
change_Pos();
} catch (InterruptedException ex) {
Logger.getLogger(Thread_Ziele.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void addBullit(Geschoss G)
{
myBullits.add(G);
}
public ArrayList <Geschoss> getBullits()
{
return myBullits;
}
public int Anz_Bullits()
{
return myBullits.size();
}
}
Java:
public class Spielversuch extends JApplet
implements Runnable
{
private ArrayList <Thread_Schrift> myThreads;
private Thread_Geschoss myBullits;
private ArrayList <Thread_Ziele> myTargets;
private MyMouseHandler myMouse;
private int x, y;
public void init()
{
setup_Applet();
// myMouse = new MyMouseHandler(this) {};
// this.addMouseListener(myMouse);
myThreads = new ArrayList <Thread_Schrift>();
myThreads.add(new Thread_Schrift("",100,100,40));
myBullits = new Thread_Geschoss();
myBullits.addBullit(new Geschoss (100,100,0.5));
System.out.println(myBullits.Anz_Bullits());
myTargets = new ArrayList <Thread_Ziele>();
myTargets.add(new Thread_Ziele(100,1000, 50, true));
// TODO start asynchronous download of heavy resources
}
public void setup_Applet()
{
this.setSize(800,600);
this.setBackground(Color.gray);
this.addMouseMotionListener(new MouseMotionListener()
{
public void mouseMoved (MouseEvent e)
{
x = e.getX();
y = e.getY();
}
public void mouseDragged(MouseEvent e) {
}
} );
this.addMouseListener(new MouseListener ()
{
public void mouseReleased(MouseEvent e)
{
myBullits.addBullit(new Geschoss(e.getX(), e.getY(), 0.5));
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
});
}
public void paint(Graphics G)
{
G.clearRect(0,0,getWidth(),getHeight());
G.drawString( x + " " + y,20,20);
G.setColor(Color.red);
if (myBullits.Anz_Bullits() > 0)
{
for (Geschoss GS : myBullits.getBullits())
{
G.drawOval(GS.get_X(), GS.get_Y(),
GS.get_D(), GS.get_D());
}
for (Thread_Ziele TG : myTargets)
{
G.fillRect(TG.get_X(), TG.get_Y(), TG.get_Breite() ,TG.get_Breite() / 2);
}
}
}
public void start()
{
for (Thread_Schrift TS : myThreads)
{
TS.start();
}
myBullits.start();
for (Thread_Ziele TG : myTargets)
{
TG.start();
}
Thread thisThread = new Thread(this, "Test");
thisThread.start();
}
public void run()
{
while (true)
{
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Logger.getLogger(Spielversuch.class.getName()).log(Level.SEVERE, null, ex);
}
repaint();
}
}
}