-2

私は非常に奇妙な問題に遭遇しました。私のプログラムは次のようになります。

class Outter{

      class Inner extends Thread {
           public void run(){
               // do something
           }
      }

      public void func() {
           new Inner().start();
           // Thread.sleep() for a while to see if the above thread has finished
           // if not stop the thread
  }

問題は、内部クラスが実際には実行されないように見えることです。そのため、関数は、本来の処理を実行する前に常に停止します。2 つのスレッドは同時に実行する必要がありますが、実際にはメイン スレッドのみが実行されており、もう 1 つのスレッドは実行状態ですが、ブロックされています。内部クラスを静的クラスに変更しようとしています。今回はうまく機能します。しかし、まだ理由はわかりません。誰かがそれを説明するのを手伝ってくれることを願っています。

4

4 に答える 4

4

あなたの問題は再現できません。

public class Outer {

    class Inner extends Thread {
        public void run() {
            System.out.println("inner");
        }
    }

    public void func() {
        new Inner().start();
        System.out.println("outer");
    }

    public static void main(String... args) {
        new Outer().func();
    }

}

これは実際には完全に実行され、「<code>outer」と「<code>inner」の両方が出力されます。

于 2009-09-07T06:50:57.570 に答える
0

私の最初の考えは、スレッドスケジューリングの「事故」を見ているということです。実際のコードを表示していないため、それが可能かどうかを確認するのは困難です. それを防ぐためにコメントを表示する sleep() を期待していましたが、実際のコードは表示されません。

しかし、別の考え、あなたは言う

関数は、本来の動作を行う前に常に停止します

それは奇妙に思えます。2 つのスレッドが何が起こっているかについて確実に一致するように、同期と待機を使用して、ある種の共有状態変数を使用することを期待します。これらを使用すると、2 つのスレッドがタイム スライスを取得するために、必然的に制御を譲る傾向があります。

実験として、開始後に Thread.yield() 呼び出しを追加して、効果があるかどうかを確認します。

于 2009-09-07T06:53:18.440 に答える
0

問題を示す簡単なコードを書こうとしましたが、失敗しました。外部クラスでメンバー変数を使用しない場合、非静的クラスも正常に機能するため、この問題は静的および非静的クラスに関するものではないようです。しかし、一度使用すると問題が発生します。問題を再現するのはそれほど簡単ではありません。次のコードは問題なく動作します。

package test;

public class Tester {

    private String message = "Hello";

    private class Inner extends Thread {

        public void run(){
            try {
                System.out.println(message);
            } catch (Exception e) {
                // TODO: handle exception
            }

        }
    }

    public void func(){
        Inner inner = new Inner();
        inner.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO: handle exception
        }
        System.out.println("stop");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Tester().func();
    }

}
于 2009-09-07T07:11:19.207 に答える
0
       // Thread.sleep() for a while to see if the above thread has finished
       // if not stop the thread

私の推測では、このロジックには何らかの問題があり、スレッドを停止してはならないときにスレッドを停止していると思われます。もちろん、問題を再現する例がなければ、それはわかりません。

于 2009-09-07T07:03:41.383 に答える