【问题标题】:Unable to run wait() method in Threading? [duplicate]无法在线程中运行 wait() 方法? [复制]
【发布时间】:2014-04-07 00:32:10
【问题描述】:

我有两个 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() 方法的教程网站吗?

【问题讨论】:

标签: java multithreading


【解决方案1】:

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

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

javadoc 表示以下内容

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

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

所以如果你用它来调用它

Thread.currentThread().wait();

但您从未在

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

然后你会得到IllegalMonitorException

附带说明,不要每次都在 Thread 实例上同步。在生命周期结束时,它们会有一些意外行为通知自己。

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

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

你能指导我任何可以学习等待()的教程网站,通知 和 notifyall() 方法。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多