0

私はタイマーを持っています.0.02秒ごとに動作します。条件が実行されているかどうかをチェックするアクション - 音楽を再生するために Thread を呼び出します。問題は、メロディーが再生されている間、この条件が再度チェックされることです。In result Exception: Exception in 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. 率直に言って、すべての条件が満たされている場合、オブザーバー テンプレートを要求します - さまざまな機会に曲を再生したい通知 () スレッド。

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

問題を特定するのに十分なコードを示していませんが、スレッドの 1 つが、他のスレッドの 1 つが現在反復処理しているコレクションを変更しようとしました。

ConcurrentModificationExceptionの JavaDocs は言う

この例外は、そのような変更が許可されていない場合に、オブジェクトの同時変更を検出したメソッドによってスローされる場合があります。たとえば、あるスレッドが Collection を変更しているときに、別のスレッドが Collection を反復処理することは一般的に許可されていません

スレッドが、同時に変更されているコレクションを反復処理し続けることを許可されている場合、プログラムの動作は非決定論的になり、未確定の時間に失敗してバグを見つけるのが困難になります。したがって、この例外は によってスローされ、プログラムは後で失敗するのではなく、すぐに失敗したIteratorと言われます。これを行う反復子は、フェイルファスト反復子として知られています。

于 2013-08-23T07:22:33.753 に答える