多线程IllegalMonitorStateException 很简单的代码,感觉没错啊!

问题描述

多线程IllegalMonitorStateException 很简单的代码,感觉没错啊!
 public class Test implements Runnable {
    Mysynchronized syn=null;
    static Boolean b=true;
    public Test(Mysynchronized syn) {
        this.syn=syn;
    }
    public static void main(String[] args) {
        Mysynchronized syn=new Mysynchronized();
        new Thread(new Test(syn),"xx").start();
        new Thread(new Test(syn),"yy").start();
    }

    @Override
    public void run() {
        while (true) {
            synchronized (syn) {
                System.out.println(Thread.currentThread().getName());
                if(b){
                    b=false;
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                }else {
                    b=true;
                    notify();
                }

            }

        }
    }

}

运行结果如下:xx
Exception in thread "xx" Exception in thread "yy" yy
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at the_eight_chapter.Test.run(Test.java:30)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at the_eight_chapter.Test.run(Test.java:23)
at java.lang.Thread.run(Unknown Source)

解决方案

wait和notify 方法调用的不对,在前面加上syn就可以了。
切记wait和notify是针对特定对象的。

 public class Test implements Runnable {
    Mysynchronized syn = null;
    static Boolean b = true;

    public Test(Mysynchronized syn) {
        this.syn = syn;
    }

    public static void main(String[] args) {
        Mysynchronized syn = new Mysynchronized();
        new Thread(new Test(syn), "xx").start();
        new Thread(new Test(syn), "yy").start();
    }

    @Override
    public void run() {
        while (true) {
            synchronized (syn) {
                System.out.println(Thread.currentThread().getName());
                if (b) {
                    b = false;
                    try {
                        syn.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                } else {
                    b = true;
                    syn.notify();
                }

            }

        }
    }

}

解决方案二:

这会死锁吧
 synchronized (syn) {
                System.out.println(Thread.currentThread().getName());
                if(b){
                    b=false;
                    try {
                        wait();//进了这里,进入了wait,run方法没有执行完,其他线程都进不了run的这段代码,该线程无法唤醒。
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                }else {
                    b=true;
                    notify();
                }

            }
时间: 2024-05-19 18:31:25

多线程IllegalMonitorStateException 很简单的代码,感觉没错啊!的相关文章

android-一段很简单的代码 Eclipse没有报错 可是手机上一点按钮就意外停止

问题描述 一段很简单的代码 Eclipse没有报错 可是手机上一点按钮就意外停止 (http://img.ask.csdn.net/upload/201505/31/1433054546_331226.png) 和书上对比了好多次了-.- 第一个 ```package com.example.ex04_01; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import a

【很简单】webbrowser执行JS代码

问题描述 [很简单]webbrowser执行JS代码 <div class="form"> <input type="text" class="text" accesskey="s" id="key" autocomplete="off" onkeydown="javascript:if(event.keyCode==13) search('key');&qu

创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]

在<基于T4的代码生成方式>中,我对T4模板的组成结构.语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码.为了让由此需求的读者对T4有更深的了解,我们通过T4来做一些更加实际的事情--SQL Generator.在这里,我们可以通过SQL Generator为某个数据表自动生成进行插入.修改和删除的存储过程.[文中源代码从这里下载] 一.代码生成器的最终使用效果 我们首先来看看通过直接适用我们基于T4的SQL生成模板达到的效果.右图(点击

php5-wordpress好在哪里?感觉功能很简单,它真的很有技术含量吗?

问题描述 wordpress好在哪里?感觉功能很简单,它真的很有技术含量吗? 我不明白wordpress好在哪,小小的体积感觉工程量不大,功能又太少,为什么这么流行,它很有技术含量吗?为什么没人开发一个比它好的. 解决方案 Wordpress主要是可以迅速开发一个属于你自己的个人网站. 它支持的插件很多,很容易扩展,有全世界的技术人员在开发维护各种新功能. 安装,使用也简单. 你要想自己再做一个,首先推广就不容易,其次,那么多已有功能你怎么吸引开发者转过来移植到你的平台.

js-jquery 有一段代码感觉不是很懂 请大家说下有什么用? 我怎么感觉它失效了

问题描述 jquery 有一段代码感觉不是很懂 请大家说下有什么用? 我怎么感觉它失效了 $("#txtDeviceName").formValidator({ tipid: "tiptxtDeviceName", onshow: "请输入测点名称", onfocus: "名称不超过10个汉字" }).InputValidator({ min: 8, max: 20, onerror: "名称4-10位汉字,请确认&

代码-一个很简单的界面设计问题。不知道具体的界面逻辑。

问题描述 一个很简单的界面设计问题.不知道具体的界面逻辑. 要求当点击下面的四个按钮时弹出新窗口(我用的push),但是push出来的默认带leftitem返回嘛,可是我的不带.不知道是不是viewcontroller写的逻辑问题. 我是把rootviewcontroller设置成UINavigationController,appdelegate代码如下 - (BOOL)application:(UIApplication *)application didFinishLaunchingWit

jsp页面框架-关于web前端兼容性问题,代码很简单,求解答

问题描述 关于web前端兼容性问题,代码很简单,求解答 无标题页 function move() { alert("hello world!"); } 在IE下不响应onclick 在火狐下可以 求改正 解决方案 你贴个function有什么用,要贴贴你调用这个function的地方啊 如果是IE10的话你需要下载.net formwork4.0控件适配器放在工程下的App_Browsers文件夹(如果没有这个文件夹就新建一个) 解决方案二: 单纯这个js方法,在任何浏览器下都能被执行

大家帮我看看,下面的代码有问题,很简单的一个调用WScript,怎么都调试不通过,报错。

问题描述 大家帮我看看,下面的代码有问题,很简单的一个调用WScript,怎么都调试不通过,报错.调试环境是:win2003+IIS6<%DimCMDShellsetCMDShell=Server.CreateObject("WScript.Shell")CMDShell.Run("cmd.exe/cdird:")%> 解决方案 解决方案二:up解决方案三:不好意思,ASP版面没人答,只好转移到此版来了

做了个flash对mc移动的控制,代码很简单:)_Flash As

复制代码 代码如下: 里面创建了4个MC,分别是zzcn_top_mc zzcn_end_mc zzcn_left_mc zzcn_right_mc . 很简单的..大家可以参考下哦..呵呵.. var place_x:Number = _xmouse; var place_y:Number = _ymouse; var sulv:Number = 6; zzcn_top_mc.onEnterFrame = function(){     this._x += (place_x - this._