gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:35:32 24 4
gpt4 key购买 nike

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

最佳答案

I want my first thread to wait until second thread completes and I am able to acheive that but in the output I am getting the exception 'java.lang.IllegalMonitorStateException'.I don't know why.

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

javadoc说以下内容

Causes the current thread to wait until another thread invokes the java.lang.Object.notify() method or the java.lang.Object.notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0).

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

所以如果你用它来调用

Thread.currentThread().wait();

但是您从未在

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

然后你会得到IllegalMonitorException .

顺便说一句,不要在 Thread 上同步。实例。它们在生命周期结束时会出现一些意想不到的行为来通知自己。

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

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

Can you plz guide me any tutorial site where I can learn wait(),notify and notifyall() methods from basics.

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

关于java - 无法在线程中运行 wait() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22189475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com