0

以下のコードでは、スレッド t1 で Runnable の生成を実行し、スレッド t2 で Runnable の消費を実行します。これはうまくいきますか?

class Processor implements Runnable {
    @override
    run(){
        produce();
        consume();
    }
    void produce(){
        // code to produce, synchronize
    }
    void consume(){
        // code to consume, synchronize
    }
}

Class App {
    public static void main(String[] args){
        Processor p = new Processor()
        Thread t1 = new Thread(p);
        t1.start();
        Thread t2 = new Thread(p); 
        t2.start();
    }
}
4

4 に答える 4

0

書かれているように、両方のスレッドが両方の関数呼び出しを行います。このようなほとんどの状況では、おそらく Produce() 関数と Consumer() 関数を別のクラスに配置することをお勧めします。他にも多くの共有ロジックがある場合は、継承を使用して、共有ロジックを実装する共通の基本クラス (必要に応じて抽象化される可能性があります) から両方のサブクラスを作成します。

それらが絶対に同じクラスでなければならない場合 (おそらくそうではない)、次のようなブール値を Processor クラスに追加してみてください。

class Processor implements Runnable
{
public Boolean producer;
@override
run()
{
if(producer){
    produce();
}
else{
    consume();
}
}
void produce()
{
// code to produce, synchronize
}
void consume()
{
// code to consume, synchronize
}
}

そしてproducer、それらを実行する前に、一方を false に設定し、他方を true に設定します。

于 2013-06-24T20:39:29.783 に答える