我有两个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()方法的教程网站。
答案 0 :(得分:2)
答案 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。