第二个线程没有给出输出(java)

时间:2013-06-07 01:38:15

标签: java multithreading inheritance

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();
    }



}

只有第一个Thread有输出。请试试我的代码。我不知道为什么会这样。 第二个线程没有输出,我想这是因为secondThread中的Wait(),我不知道该怎么做。

2 个答案:

答案 0 :(得分: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的问题。

答案 1 :(得分:0)

这段代码实在令人困惑,这使得很难看到潜在的问题。

  • 您永远不应该使用小写字母开始一个类,因为它使它看起来像一个方法/字段名称(例如firstThread)。
  • 我很确定WaitNotify没有理由synchronized
  • 为什么secondThread继承自firstThread ???实际上,你为什么要这两个班?你应该从Helper1或其他东西创建一个匿名的内部类。

无论如何,问题是当你在thread1中调用Notify()时,它会通知本身,而不是thread2。