3

私は次のクラスを持っています:

public class MovementThread extends Thread {

    private float[] myObject;

    @Override
    public void run() {

    }

    public void setMyObject(float[] array) {
        myObject = array;
    }
}

問題は、MovementThreadが常に実行されている必要があるためwhile(true)Run method. ただし、myObjectは別の から更新されるため、が にスタックしているThread場合は発生しません。また、run メソッドのコードは、 が実行されているときに実行されるべきではありません。ThreadRun methodmyObject

これを行う複雑でない方法はありますか?
この場合のベストプラクティスについて疑問に思っているだけですが、これはかなり頻繁に発生するはずです。

4

3 に答える 3

2

まず最初に、今日の標準的な方法は、スレッドを拡張するのではなく、ランナブルを実装することです(「ランナブルの実装」と「スレッドの拡張」を参照)。

Awhile(true)は、runメソッドに何を入れるかについての正しい考えです。while(someBooleanVariable)最終的には、MovementThreadを強制終了する方法を提供するためにに切り替えます。

MovementThreadの実行からのスレッドが他のスレッドからの他のメンバー呼び出しと競合しないことを確認する現在の方法は、同期を使用することです。簡単な使用法では、通常、関数宣言の前に同期を付けることができ、そのような関数はすべて織り交ぜられません。

これらすべての変更を加えたサンプル:

myObjectのすべての読み取りと書き込みは、同期とマークされた関数で行われることに注意してください。

public class MovementThread extends Runnable{

    private float[] myObject;
    volatile boolean stillAlive = true;

    @Override
    public void run() {
       while (stillAlive)
       {
          processMyObject();
          Thread.sleep(1000);
       }

    }

    private synchronized void processMyObject()
    {
       // Modify or read myObject
    }

    public void kill()
    {
       stillAlive = false;
    }  

    public synchronized void setMyObject(float[] array) {
        myObject = array;
    }
}
于 2012-08-28T05:18:02.173 に答える
1

あなたの問題は、スレッドの Produce-Consumerパターンにあります。あなたの場合、 Producer は1で Consumer は1です。

ここでConcurrentパッケージを使用してそれを行う方法の良い例を見つけるでしょう

double[] でBlockingQueueReplaceを使用すると完了です。Object

Producer(BlockingQueue theQueue) { this.queue = theQueue; }
queue.put(justProduced);
Consumer(BlockingQueue theQueue) { this.queue = theQueue; }
Object obj = queue.take();
于 2012-08-28T05:26:52.067 に答える
0

同じオブジェクトを変更して使用する 2 つの異なるスレッドがあるため、プログラムに同期を導入するのが最善です。同期ブロック内にコードを記述する必要があります。

ここで、他のスレッドの変数をすぐに更新したい場合。この変数は揮発性として保持できます。その場合、myObject 値は、モディファイア スレッドで変更されるとすぐにエグゼキューター スレッド内で変更されます。擬似コードを参照してください:-

//Modifier thread 

synchronized(myObject){
        // do something and update the myObject
        myObject.setSomething(someValue);
}

//Executor thread

synchronized(myObject){
        //do something 
        if(myObject.getSomeValue()==someMeaningfulValue){
             myObject.execute() 
        }
}

   // To immediately update myObject, you can declare it as 

    private volatile MyObjectClassName myObject;

質問が詳細で更新されない場合は、うまくいくはずです。

于 2012-08-28T05:24:59.243 に答える