public class ThreadTest implements Callable<String> {

	 public  String call() throws Exception {
// TODO Auto-generated method stub
wait(10000);
return "hello";
} }

调用代码:

public static void main(String[] args) {
System.out.println("開始启动线程"+Thread.currentThread().getName());
ExecutorService exe = Executors.newCachedThreadPool();
ThreadTest t= new ThreadTest();
Future<String> f = exe.submit(t);
Future<String> f2 = exe.submit(t);
try { t.notify(); System.out.println(f.get());
System.out.println(f2.get());
System.out.println("主线程"+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

在学习并发是遇到了例如以下错误

java.lang.IllegalMonitorStateException: current thread not owner

我的代码例如以下:

通过查找资料找到原因即解决之道。

《java编程思想》第四版一书中有描写叙述到:“线程操作的wait()、notify()、notifyAll()方法仅仅能在同步控制方法或同步控制块内调用。

假设在非同步控制方法或控制块里调用。程序能通过编译,但运行的时候,将得到 IllegalMonitorStateException
异常。并伴随着一些含糊信息,比方 ‘当前线程不是拥有者’。

事实上异常的含义是 调用wait()、notify()、notifyAll()的任务在调用这些方法前必须 ‘拥有’(获取)对象的锁。

JAVA JDK API文档中也有描写叙述例如以下:

wait()、notify()、notifyAll()法仅仅应由作为此对象监视器的全部者的线程来调用。

通过下面三种方法之中的一个,线程能够成为此对象监视器的全部者:

  • 通过运行此对象的同步 (Sychronized) 实例方法。
  • 通过运行在此对象上进行同步的 synchronized 语句的正文。

  • 对于 Class 类型的对象,能够通过运行该类的同步静态方法。

依据以上分析,我的代码改动例如以下:

1、call方法前添加synchronizedkeyword,这样调用wait()方法就不会出错了。

2、在t.notify()方法调用时使用同步上下文。改为例如以下:

synchronized (t) {
t.notify();
}

再次运行就正常了。

并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析的更多相关文章

  1. 线程中的current thread not owner异常错误

    多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等 这些方法是当前类的实例方法, wait()      是使持有对象锁的线程释放锁;wait(lo ...

  2. Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法

    代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...

  3. (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决

    作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...

  4. java CountDownLatch报错java.lang.IllegalMonitorStateException: null

    笔者使用websocket进行通信,服务器异步返回.websocket服务器又异步调用其他websocket,也是异步访问. 由于无法预测服务器调用第三方websocket什么时候调用结束,使用了Co ...

  5. (四)关于java.lang.IllegalMonitorStateException异常说明

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  6. 关于java.lang.IllegalMonitorStateException异常说明(四)

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  7. 错误: java.lang.reflect.InvocationTargetException

    错误: java.lang.reflect.InvocationTargetException    at sun.reflect.NativeMethodAccessorImpl.invoke0(N ...

  8. ReentrantLock$Sync.tryRelease java.lang.IllegalMonitorStateException

    早上一来,例行性的看主要环境的运行情况,发现有个环境中有如下异常: 17-02-28 08:13:37.368 ERROR pool-2-thread-65 com.ld.net.spider.Spi ...

  9. Java之java.lang.IllegalMonitorStateException

    今天又中彩了, 原本很简单的多线程程序, 蓦然间冒了个"java.lang.IllegalMonitorStateException" , 杀了个措手不及. 一直纳闷, 为什么为什 ...

随机推荐

  1. WebApi异常处理解决方案

    一.使用异常筛选器捕获所有异常 首先在App_Start里面新建一个类WebApiExceptionFilterAttribute.cs,继承ExceptionFilterAttribute,重写On ...

  2. Mac 常用命令介绍

    1.查看所有shell cat /etc/shells 2.查看当前使用的shell类型 $ echo $SHELL 3.

  3. Mac 上的终端神器 iTerm2

    官方下载地址:http://www.iterm2.com/ 主题下载地址:https://github.com/mbadolato/iTerm2-Color-Schemes 第三方教程推荐:http: ...

  4. Hybird App ( 混合模式移动应用)开发初体验

    最近1,2个月一直都尝试开发一款Hybird app,遇到了很多问题,谈谈自己的体会. Hybird app (混合模式移动应用),它利用例如安卓端webview组件+HTML5内嵌的方式混合的方式开 ...

  5. 75. Find Peak Element 【medium】

    75. Find Peak Element [medium] There is an integer array which has the following features: The numbe ...

  6. 游戏引擎 Unity 的入门易精通难体现在哪?为什么?

    04月212014年   [王楠的回答(37票)]: 为什么入门简单,看一下官网的文档和视频教程就知道了,看完几段视频和例子就能让初学者做出能玩的东西,其他同类商业引擎都做不到.物体+组件的结构,所见 ...

  7. spring boot中 使用http请求

    因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用http请求. 服务端没有什么好说的,本来就是使用web 页面进行访问的,所以spring boot启动后,controller层的接口就 ...

  8. html 标签 链接

    <a href="http://www.baidu.com">百度</a> <a href="#here">here< ...

  9. iOS开发之Auto Layout入门(转)

    随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享. 什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新 ...

  10. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...