wandzkwowo723 2013-05-05 11:02
浏览 241
已采纳

Java 线程问题

public class ThreadTest {

/**

  • @param args */ public static Integer ticket = 1;

public static void main(String[] args) {

new Thread() {

@Override
public void run() {

for (int i = 0; i < 50; i++)
loopThread(1);
}

}.start();

for (int i = 0; i < 50; i++)
loopThread(0);

}

public static void loopThread(int id) {

// main
synchronized (ticket) {
if (id == ticket && ticket == 0) {

System.out.println("loop 100 times for main thread");

// switch the ticket to sub thread
ticket = 1;
ticket.notify();

} else if (id == ticket && ticket == 1) {

System.out.println("loop 10 times for sub thread");

// switch the ticket to main thread

ticket=0;
ticket.notify();

} else {
try {
ticket.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

求教这个问题错在哪?错误是

loop 10 times for sub thread
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at ThreadTest.loopThread(ThreadTest.java:45)
at ThreadTest$1.run(ThreadTest.java:16)

请不吝赐教,拜谢。。。。

  • 写回答

2条回答 默认 最新

  • jinnianshilongnian 2013-05-05 19:10
    关注

    比如
    System.out.println("loop 100 times for main thread");

    // switch the ticket to sub thread
    ticket = 1;

    此处ticket又是个新对象

    所以接着调用 ticket.notify(); 会抛刚才的异常 即锁对象不是原来的了

    java.lang.IllegalMonitorStateException异常 原因就是当前线程没有获得对象的锁。

    此处建议使用AtomicInteger 加 自身的自增完成

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘