15

Java では、別の同様のクラス内で Thread を拡張するクラスを実装する必要があります。それは可能ですか?

私がやろうとしていることの例は、次の(簡略化された)スニペットです。

// The first layer is a Thread
public class Consumer extends Thread {

    // Variables initialized correctly in the Creator
    private BufferManager BProducer = null;

    static class Mutex extends Object {}
    static private Mutex sharedMutex = null;


    public Consumer() {
        // Initialization of the thread
        sharedMutex = new Mutex();

        BProducer = new BProducer(sharedMutex);
        BProducer.start();
    }


    public void run() {

        int data = BProducer.getData();

        ///// .... other operations
    }


    ////// ...... some code

    // Also the second layer is a Thread
    private class BufferManager extends Thread {

        Mutex sharedMutex;
        int data;

        public BufferManager(Mutex sM) {
            sharedMutex = sM;
        }

        public int getData(Mutex sM) {
            int tempdata;
            synchronized(sharedMutex) {
                tempdata = data;
            }
            return tempdata;
        }

        public void run() {
            synchronized(sharedMutex) {
                data = getDataFromSource();
            }
            ///// .... other operations on the data
        }
    }
}

2 番目のスレッドは、最初のスレッド内に直接実装されます。さらに、そのようなミューテックスの実装が機能するかどうかを知りたいです。そうでない場合、それを行うためのより良い(標準的な)方法はありますか?

前もって感謝します。

4

2 に答える 2

29

は「内部」で実行されるのThreadではなく、むしろ並行して実行されます。

そうです、別の を起動しThreadて、他の 2 つの と並べて実行できますThread。実際のところ、 (OS が許可している限り)誰でもThread別のアプリを起動できます。Thread

于 2012-06-19T19:15:23.727 に答える
7

はい、これは機能するはずであり、共有ミューテックスがその仕事をするはずです。パラノイアから、final奇妙な「エスケープ」の問題を回避するために、両方のミューテックス宣言を作成します。例えば

final Mutex sharedMutex;

1 つの提案: おそらくこれは私のスタイルですが、このようなコードではほとんど拡張しませんThreadRunnable代わりに実装するだけです。IMO 少しわかりにくいです (ここでは YMMV)。さらに、 などの高度な同時実行ユーティリティの使用を開始するExecutorと、それらRunnablesはスレッドではなく を処理します。

于 2012-06-19T19:26:19.617 に答える