2013-08-23 46 views
0

我有一个计时器,它使得每0.02秒的动作。 检查条件的操作,如果执行 - 请致电Thread来播放音乐。 问题是,当旋律正在播放时,这个条件再次被检查。在结果例外: 异常在线程 “AWT-EventQueue的-0” java.util.ConcurrentModificationExceptionJava中的线程。 “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. 坦白地说,它会引起观察者模板,如果所有条件都是met - notify()要播放歌曲的线程,适用于不同的场合。

回答

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(); 
    } 

} 
} 

你应该某处放置锁,以便这两个类都可以访问它

+0

我找到了解决方案,它是 - 使用ExecutorService,我认为你的解决方案不会更糟 – Eldar

0

您没有显示足够的代码来指出问题,但是其中一个线程试图修改您的其他线程当前正在迭代的集合。

ConcurrentModificationException的Javadoc说

此异常可能由已检测出的对象的并发修改时这种修改是不允许的方法被抛出。例如,它是而不是通常允许一个线程到修改 a集合,而另一个线程是迭代通过它。

如果一个线程被允许继续遍历同时被修改的集合,那么程序行为将变得非确定性,并且会在未确定的时间失败,导致难以发现错误。因此,此异常是由Iterator引发的,并且该程序据说具有失败的快速而不是稍后失败。这样做的迭代器被称为失效快速迭代器。

相关问题