-2
class firstThread extends Helper1
{
        Thread thread_1 = new Thread(new Runnable()
        {
            @Override
            public void run() {
                try {
                    for (int i = 1; i <= 20; i++) {
                        System.out.println("Hello World");
                        Thread.sleep(500);
                        if (i == 10) {
                            Notify();
                            Wait();
                        }                       
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }); 
}
class secondThread extends firstThread 
{
    Thread thread_2 = new Thread(new Runnable()
    {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {   
                Wait();
                for(int i = 1; i<=20; i++)
                {
                    System.out.println("Welcome");
                    Thread.sleep(100);
                }
                Notify();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block 
                e.printStackTrace();
            }
        }
    });
}

class Helper1
{
    public synchronized void Wait() throws InterruptedException
    {
        wait();
    }
    public synchronized void Notify() throws InterruptedException
    {
        notify();
    }
}
public class InheritanceClass {

    public static void main(String[] args)
    {
        Thread f = new Thread(new firstThread().thread_1);
        Thread s = new Thread(new secondThread().thread_2);
        f.start();
        s.start();
    }



}

最初のスレッドのみが出力を持ちます。私のコードを試してください。なぜそれが起こるのかわかりません。2 番目のスレッドから出力が得られません。secondThread の Wait() が原因だと思います。どうすればよいかわかりません。

4

2 に答える 2

2

問題は次のコードにあります。

class Helper1
{
    public synchronized void Wait() throws InterruptedException
    {
        wait();
    }
    public synchronized void Notify() throws InterruptedException
    {
        notify();
    }
}

上記のwait()との呼び出しは ととnotify()同等です。ただし、とは別のオブジェクトであるため、このメソッドを介して通信することはありません。this.wait()this.notify()thread1thread2

通信を行うには、共有ロック オブジェクトが必要です。例えば:

Object lock = new Object();
firstThread = new firstThread(lock);
secondThread = new secondThread(lock);

および次のような同期:

void wait(Object lock) {
    synchronized(lock) {
        lock.wait();
    }
}

void notify(Object lock) {
    synchronized(lock) {
        lock.notify();
    }
}

免責事項:私はこれを個人的に行うことは決してありませんが、OPの質問には答えます.

于 2013-06-07T01:52:00.640 に答える
0

このコードは非常に紛らわしく、根本的な問題を理解するのが難しくなっています。

  • メソッド/フィールド名のように見えるため、小文字でクラスを開始しないでください (例: firstThread)。
  • 私はかなり確信WaitNotifyており、そうする理由はありませんsynchronized
  • secondThreadから継承するのはなぜですかfirstThread??? 実際、なぜこれらの 2 つのクラスがあるのでしょうか。Helper1または何かから匿名の内部クラスを作成するだけです。

とにかく、問題はNotify()、thread1を呼び出すと、thread2 ではなく自分自身に通知することです。

于 2013-06-07T01:51:51.597 に答える