mas*_*amr 2 java multithreading
我正在创建一个Swing应用程序来制作游戏.它在屏幕外的随机位置创建图像,当它们离开屏幕时我想删除它们.请查看代码段:
public void checkTrolls(){ //CAUSES EXCEPTION ERROR WHEN SPRITE EXIT SCREEN
for(AutomatedSprite a : trolls){
if(a.getX() < 0 - a.getImage().getWidth())
trolls.remove(a);
if(a.getY() < 0 - a.getImage().getWidth())
trolls.remove(a);
if(a.getX() > 800)
trolls.remove(a);
if(a.getY() > 600)
trolls.remove(a);
}
}
@Override
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while(true){
dodger.update(); //update sprite
if(trolls.size() != 6){
trolls.add(new AutomatedSprite("images/troll_face.png"));
}
for(Sprite troll : trolls){
troll.update(); //UPDATES MY SPRITES
}
checkTrolls(); //CHECKS TROLLS EXITING THE SCREEN
repaint();
for(Sprite troll : trolls){
System.out.println("X: " + troll.getX());
System.out.println("Y: " + troll.getY());
}
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = timeDiff - DELAY;
if(sleep < 0)
sleep = 5;
try {
Thread.sleep(sleep);
} catch (InterruptedException e) { e.printStackTrace(); }
beforeTime = System.currentTimeMillis();
}
}
Run Code Online (Sandbox Code Playgroud)
巨魔是AutomatedSprites的Vector,当他们离开屏幕时我得到一个ConcurrentModificationException,显然我无法从我的向量中删除实例.
因此,当线程更新所有精灵时,我似乎无法从向量中删除任何东西,有没有办法暂停我的线程,所以我可以删除精灵?
PS:这是整个课程,以防我错过了什么:Pastebin
迭代时无法从集合中删除,对于单线程环境和多线程环境都是如此. syncrhonized仍会导致问题,Thread.sleep也是如此.使用和迭代器并删除该方式.
public void checkTrolls(){
for(Iterator<AutomatedSprite> itr = trolls.iterator(); itr.hasNext();){
AutomatedSpring nextElemnt = itr.next();
if(youShouldRemoveTheSprite){
itr.remove();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以在这里你使用你的巨魔集合提供的迭代器.并且您要求Iterator安全地从集合中删除对象.
现在,如果执行具有多个线程的checkTrolls,则需要进行同步.你可以这样做
public synchronized void checkTrolls(){ ...
Run Code Online (Sandbox Code Playgroud)
编辑根据您最近的评论/链接.
你不是将Iterator.next()赋给变量,而是多次调用iterator.next().每次调用时,next()都会将迭代器移动到List的下一个元素.因此,在一个循环迭代结束时,您将迭代器移动到列表中的第6个元素.如果你索引它而不是它看起来像:
for(Iterator<AutomatedSprite> itr = trolls.iterator(); itr.hasNext(); ){
if(trolls.get(0).getX() < 0 - trolls.get(1).getImage().getWidth() ||
trolls.get(2).getY() < 0 - trolls.get(3).getImage().getWidth() ||
trolls.get(4).getX() > 800 ||
trolls.get(5).getY() > 600){
trolls.remove(trolls.get(5));
}
Run Code Online (Sandbox Code Playgroud)
注意这个例子:在0,1,2,3,4 ...索引仅用于演示,实际上它将是i = 0; start for loop trolls.get(i ++).getX(),trolls.get(i ++).getY()等等.如果您的列表是10,000,那么最终会得到NoSuchElementException
因此,例如,如果你只有3个巨魔,一旦你到达第4个itr.next(),你将得到NoSuchElementException.因此,您需要将next()元素存储在变量中并处理该变量,以便itr.hasNext(); 正确返回,itr.remove()也正常工作.
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |