并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析
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 分析的更多相关文章
- 线程中的current thread not owner异常错误
多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等 这些方法是当前类的实例方法, wait() 是使持有对象锁的线程释放锁;wait(lo ...
- Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法
代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...
- (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决
作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...
- java CountDownLatch报错java.lang.IllegalMonitorStateException: null
笔者使用websocket进行通信,服务器异步返回.websocket服务器又异步调用其他websocket,也是异步访问. 由于无法预测服务器调用第三方websocket什么时候调用结束,使用了Co ...
- (四)关于java.lang.IllegalMonitorStateException异常说明
1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...
- 关于java.lang.IllegalMonitorStateException异常说明(四)
1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...
- 错误: java.lang.reflect.InvocationTargetException
错误: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(N ...
- ReentrantLock$Sync.tryRelease java.lang.IllegalMonitorStateException
早上一来,例行性的看主要环境的运行情况,发现有个环境中有如下异常: 17-02-28 08:13:37.368 ERROR pool-2-thread-65 com.ld.net.spider.Spi ...
- Java之java.lang.IllegalMonitorStateException
今天又中彩了, 原本很简单的多线程程序, 蓦然间冒了个"java.lang.IllegalMonitorStateException" , 杀了个措手不及. 一直纳闷, 为什么为什 ...
随机推荐
- mysql 主库有数据通过锁库做主从
master@localhost[(none)]> grant replication slave on *.* to 'repl'@'192.168.1.177' identified by ...
- IP报文格式及各字段意义
IP数据包由报头和数据两部分组成.报头的前一部分是固定长度,共20字节.在报头的固定部分的后面是可选部分——IP选项和填充域. 首部各字段的含义如下 1.版本 占4位,指IP协议的版本. 2 ...
- 自己动手开发更好用的markdown编辑器-06(自动更新)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/05/12/hexomd-06/ 文章目录 1. 自动更新方案 2. 实现 ...
- android studio- Gradle "xxx" project refresh failed
Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing Gradle Project ,有时新建项目的时候报 Gradl ...
- SharePoint管理中心配置内容数据库
SharePoint管理中心配置内容数据库 在SharePoint2010中,内容数据库是组织数据的核心. 是全部站点内容信息,如文档.列表数据和Web部件属性等存储的地方.默认地,内 ...
- FreeBSD安装MySQL5.7.17
[root@tuhooo /usr/ports/databases/mysql57-server]# make install===> Installing for mysql57-serve ...
- MFC 点击按钮,弹出另一个对话框(模态及非模态对话框)
1. 模态对话框 资源视图->Dialog->右键->添加资源->新建->对话框->右键->添加类. 例如:在A_dialog中点击按钮弹出B_dialog ...
- 2017-5-14 湘潭市赛 Highway 先获得直径S,T。则一开始S,T相连,然后其他的点如果离S更远那么连在S,否则T;
Highway Accepted : Submit : Time Limit : MS Memory Limit : KB Highway In ICPCCamp there were n towns ...
- sublime和webstorm安装zencoding
[webstorm] 1.下载模板,地址为http://code.google.com/p/zen-coding/downloads/list,下载以下文件 WebIDE and IntelliJ I ...
- 【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本
上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化. 上一篇地址:<[Mac + Appium学习(一)]之安装Appium环境> 这一篇参考:<Ma ...