public class ThreadTest
{
public static Integer i = new Integer(0);
public static void main(String[] args) throws InterruptedException
{
ThreadTest threadTest = new ThreadTest();
Runnable odd = threadTest.new Numbers(1, "thread1");
Runnable even = threadTest.new Numbers(0, "thread2");
((Thread) odd).start();
((Thread) even).start();
}
class Numbers extends Thread
{
int reminder;
String threadName;
Numbers(int reminder, String threadName)
{
this.reminder = reminder;
this.threadName = threadName;
}
@Override
public void run()
{
while (i < 20)
{
synchronized (i)
{
if (i % 2 == reminder)
{
System.out.println(threadName + " : " + i);
i++;
i.notify();
}
else
{
try
{
i.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
1
A
回答
-1
您不能将wait()和notify()放在同一个同步块中,因为这只会导致死锁。确保只有等待和通知功能都包裹着这样一个synchronized块:
synchronized (i) {
i.wait(); // or i.notify();
}
0
由于文档状态异常时
当前线程不是这个对象监视器
的所有者抛出
报告还指出,
这种方法抄只能由作为此对象监视器所有者的线程调用。
而这个条件可以通过
- 通过执行对象的同步实例方法获得。
- 通过执行同步对象的同步语句的主体。
- 对于Class类型的对象,通过执行该类的同步静态方法。
您可以尝试从使用i
的类中调用wait方法。这可以通过扩展该类并为notify
和wait
编写两种新方法来完成。
3
您不能在i
上同步,因为它在执行程序期间发生更改。
由于在Java中Integer
是不可改变的,执行i++
i
将包含到另一个对象,而不是你有的对象的引用之后。因此,您不能在这个新对象上调用wait()
/notify()
,因为这些方法可能只能在您对的对象上调用,否则您将获得IllegalMonitorStateException
。
您需要在执行过程中不会更改的某个其他对象上进行同步。例如,可为此目的创建一个单独的对象:
public class ThreadTest {
public static Integer i = new Integer(0);
public static Object lock = new Object();
...
class Numbers extends Thread {
...
@Override
public void run() {
...
synchronized (lock) {
...
lock.notify();
...
lock.wait();
...
}
}
}
}
1
这条线:
i++;
相当于:
i = i + 1;
其中(由于自动装箱)变得像:
i = new Integer(i.intValue() + 1);
因此,当您拨打i.notify()
时,您将在旧i
上同步,而不是新的。
我建议改变i
成普通int
变量,并创建一个单独的对象进行同步的:
static int i = 0;
static Object iMonitor = new Object();
+0
感谢你的回复..真的帮助了我 – Ajay 2010-10-27 17:46:19
相关问题
- 1. 当我试图运行Vogella.de JPA教程
- 2. 试图运行我的应用程序
- 3. 试图运行我的应用程序
- 4. 当我试图运行此查询如何选择子查询
- 5. 如何添加此代码,我试图运行我的程序后,使用XAMPP
- 6. 当我尝试运行我的应用程序时缺少.dll
- 7. 当我试图运行协程时,我总是收到错误
- 8. 我试图在运行时创建我的sql_stmt时运行SQL过程。当我试图在()
- 9. 如何运行此程序?
- 10. 无法运行此程序?
- 11. 我试图运行
- 12. 当我在没有调试的情况下运行时,Visual Studio C++程序不工作,但是当我在调试下运行时,程序运行良好?
- 13. 当试图使用Rails运行Rcov 3应用程序时,我收到此错误
- 14. 我试图运行文件程序,我得到错误FileNotFoundException
- 15. 当我尝试使用GoogleMapApiv2运行应用程序时出错
- 16. 程序编译,但是当我尝试运行
- 17. 当我调试时,Visual Studio 2010运行安装程序
- 18. 构建失败当我尝试运行应用程序
- 19. 当我尝试运行安装程序时未注册的类
- 20. 当我运行应用程序时xcode调试终止
- 21. 烧瓶错误当我运行程序
- 22. 当我在运行iPhone应用程序
- 23. 当我运行的Web应用程序
- 24. 当我运行程序时JScrollPane丢失
- 25. 如何当我运行PL/SQL程序
- 26. C2280错误,当我运行程序
- 27. Java IllegalArgumentException当试图运行一个程序
- 28. Tomcat ClassNotFound异常当试图运行应用程序
- 29. 当试图在eclipse上运行程序时,它崩溃
- 30. 当我尝试运行此代码时,出现语法错误
+1,打我吧:) – SimonJ 2010-10-17 15:43:05
感谢真的gelped我很多 – Ajay 2010-10-27 17:47:44