2013-08-23 47 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引發的,並且該程序據說具有失敗的快速而不是稍後失敗。這樣做的迭代器被稱爲失效快速迭代器。

相關問題