1

別のあいまいな例で申し訳ありません...しかし、新しいスレッドインスタンスを開始する単一のクラスがあります。ただし、新しいスレッド インスタンスを追加すると、最初のインスタンスが中断 (破棄) されます。

しかし、各インスタンスが 1 つのスレッドしか開かないクラスの 2 つのインスタンスを (別々に、それらを jar ファイルに変換した後に) 実行すると、両方とも同時に正常に実行されます。

エラーは、マルチスレッドを実装している方法であると確信しています。

探すべきものの提案はありますか?ありがとう!あいまいな例で申し訳ありません。

4

2 に答える 2

4

任意のクラスがスレッドセーフであると想定することはできません。

クラスの作成者は、そのクラスのスレッド セーフについて明示する必要がありますが、そうでないことは非常に一般的です。サーブレットなどの環境が本質的にマルチスレッド化されている可能性があることを考えると、これは実際の問題になる可能性があります。

クラスを調べて、スレッドセーフなメソッドがある場合はそれを発見する必要があります。クラス InstanceOfClassIDontControl に、マルチスレッド アクセスによって混乱する静的変数が含まれている可能性があります。クラスを制御できないだけでなく、そのソースも表示できない場合は、所有者のサポートが必要になります。

于 2009-08-06T21:35:38.907 に答える
0

わかりました、ここに例があります:

public class driver {

    public static void main(String args[])
    {
        Thread x;
        Thread y;

        x = new Thread(new pow());
        y = new Thread(new pow());

        x.start();
        y.start();  
    }
}

public class pow extends Thread {

    public void run() {
        InstanceOfClassIDontControl a = new InstanceOfClassIDontControl();
                a.doVariousProcesses();
    }
}

この例では、(明らかに) インスタンスが作成され、スレッドで呼び出されるクラスを制御しません。各スレッドは数分間実行される場合があります。しかし、並行スレッドが (この場合は y.start() で) 実行されるたびに、x.start() の run() インスタンスで呼び出されたオブジェクトのアクションが破棄されます。

于 2009-08-06T21:13:56.877 に答える