0

我有一个计时器,它每 0.02 秒动作一次。检查条件的操作(如果执行) - 调用 Thread 播放音乐。问题是在播放旋律时,再次检查此条件。结果异常:线程“AWT-EventQueue-0”中的异常 java.util.ConcurrentModificationException

- Background.java
....
 Thread eventMusic = new Thread(new EventMusic());
... check different conditions ... (every 0.02s)
 if everything is ok  -> eventMusic.start();

- EventMusic.java
package Shooter2Dv23082013;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class EventMusic implements Runnable{
    @Override
    public void run() {

        try {
            Player p = new Player(new FileInputStream(getClass().getClassLoader().getResource("res/nameSong.mp3").getPath()));
            p.play();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();}


    }
}

问题是。

  1. 创建多个线程?如何为每个条件创建线程(即,很多线程,但我不知道其中有多少会,下班后 - 它会关闭)

  2. 坦率地说,它请求观察者模板,如果所有条件都满足 - notify() 线程想要播放歌曲,适用于不同的场合。

4

2 回答 2

0

首先,您的问题可能出在您的检查功能中。

您可以使用某种锁来防止在播放音乐时进行条件检查:

ReentrantLock lock = new ReentrantLock();


Thread eventMusic = new Thread(new EventMusic());
lock.lock();
... check different conditions ... (every 0.02s)
if everything is ok  -> eventMusic.start();
lock.unlock();


public class EventMusic implements Runnable{
@Override
public void run() {

    try {
        lock.lock();
        Player p = new Player(new FileInputStream(getClass().getClassLoader().getResource("res/nameSong.mp3").getPath()));
        p.play();
    } catch (JavaLayerException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();}
    finally{
       lock.unlock();
    }

 }
}

你应该把锁放在某个地方,这样两个班级都可以访问它

于 2013-08-23T08:38:07.050 回答
0

您没有显示足够的代码来查明问题,但您的一个线程已尝试修改您的其他线程之一当前正在迭代的集合。

ConcurrentModificationException的 JavaDocs说

当这种修改是不允许的时,检测到对象的并发修改的方法可能会抛出此异常。例如,通常不允许一个线程在另一个线程对其进行迭代时修改Collection 。

如果允许线程继续迭代同时被修改的集合,则程序行为将变得不确定,并且它将在未确定的时间失败,从而导致难以发现错误。因此,这个异常是由 抛出的,Iterator并且程序被称为快速失败而不是稍后失败。执行此操作的迭代器称为快速失败迭代器。

于 2013-08-23T07:22:33.753 回答