无法在线程中运行wait()方法?

时间:2014-03-05 05:38:03

标签: java multithreading

我有两个Java类

public class Firstclass
{
    public static void main(String args[]) throws InterruptedException
    {
        System.out.println("Main start....");
        Secondclass s=new Secondclass();

        Thread t1 = new Thread(s);
        t1.setName("First Thread");

        Thread t2=new Thread(s);
        t2.setName("Second Thread");

        t1.start();

        t2.start();
        System.out.println("Main close...");           
    }
}

public class Secondclass implements Runnable
{ 
    public static Object obj;

    int counter=10;

    public  void inc()
    {
        counter++;
    }

    public  void dec()
    {
        counter--;
    }

    @Override
    public void run()
    {
        try
        {
            loop();
        }
        catch(Exception e)
        {
            System.out.println("exception is"+e);
        }
    }

    public void loop() throws InterruptedException
    {
        for(int i=0;i<10;i++)
        {            
            if(Thread.currentThread().getName().equals("First Thread"))
            {
                Thread.currentThread().wait();
                inc();                
            }
            else
            {
                dec();
            }
            System.out.println("Counter=="+counter);
        }
    } 
}

我的第一个问题是:我希望我的第一个线程等到第二个线程完成并且我能够实现,但在输出中我得到异常java.lang.IllegalMonitorStateException。我不知道不知道为什么。

我的第二个问题是:您能否指导我任何可以从基础知识中学习wait(),notify和notifyall()方法的教程网站。

2 个答案:

答案 0 :(得分:2)

答案1: - 你需要使用如下的join(): -

t2.start();
t2.join();

t1.start();
t1.join();

答案2: - 请参阅此link以获取等待并通知示例。

答案 1 :(得分:2)

  

我希望我的第一个线程等到第二个线程完成并且我是   能够实现,但在输出中我得到了例外   'java.lang.IllegalMonitorStateException'。我不知道为什么。

wait()方法在Object类中声明,它是Java中所有引用类型的祖父。因此,您可以在任何导致对象引用的表达式上调用该方法。

javadoc说明以下

  

导致当前线程等待,直到另一个线程调用   java.lang.Object.notify()方法或java.lang.Object.notifyAll()   此对象的方法。换句话说,这种方法完全如此   如果它只是执行调用wait(0)

     

当前线程必须拥有此对象的监视器。线程释放   此监视器的所有权,并等待另一个线程通知   在这个对象的监视器上等待通过a唤醒的线程   调用notify方法或notifyAll方法。线程然后   等到它可以重新获得监视器的所有权并恢复   执行。

所以如果你用

来调用它
Thread.currentThread().wait();

但你从未在

返回的对象上同步(即获得监视器)
Thread.currentThread()

然后你会得到IllegalMonitorException

作为旁注,不要在Thread个实例上进行每个同步。他们有一些意想不到的行为,在他们的生命周期结束时通知自己。

问题的一个可能解决方案是为Object个实例提供共享Runnable。每个人都尝试围绕某个代码块同步该对象。另一个线程必须等到第一个获取监视器的线程完成后才使用它。

但是,不要在这里依赖订单。 Thread调度程序将决定每个线程何时运行。

  

你可以引导我任何我可以学习wait()的教程网站,通知   和来自basics的notifyall()方法。

如果您有这样的问题,只需谷歌java <the thing you want>。在这种情况下,您需要查看Javadoc和Concurrency tutorials