并发 错误 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" , 杀了个措手不及. 一直纳闷, 为什么为什 ...
随机推荐
- UDP与TCP报文格式,字段意义
UDP报文 1.UDP有两个字段:数据字段和首部字段. 首部字段 首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节. 1)源端口:源端口号.在需要对方回信时选用.不需要时可 ...
- 经常使用传感器协议3:CJ/T-188 冷热量表协议解析2
本文详细阐述JY公司冷热量表(记热量)传输协议.并以此说明CJ/T-188协议在厂家详细应用时,并不一致. 本文及兴许文章将对这些不同点予以总结(文中所述协议与日志"CJ/T-188 ...
- js将用户上传gif动图分解成多张帧图片
js将用户上传gif动图分解成多张帧图片 写在前面 工作中遇到一个这么一个需求:这是一个多图上传的场景,如果用户上传选择多张图片,则上传后直接展示多张图片,如果上传的图片是gif动图,则需要分解这张动 ...
- python学习之lambda()
中学时期,数学老师不时在口中说着:“拉姆达!λ...”.这里的“拉姆达”表示第十一个希腊字母. 而在python中,lambda表示匿名函数. 先来看看匿名函数 >>> f = la ...
- php类库PHP QR Code 二维码
php类库PHP QR Code 二维码 php类库PHP QR Code 二维码 php类库PHP QR CodePHP QR Code is open source (LGPL) library ...
- volatile关键字比较好的解释
http://www.tuicool.com/articles/IRvUJbN http://tengj.top/2016/05/06/threadvolatile4/?utm_source=tuic ...
- org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc
重新添加一个凭证,用新的凭证 第二总是取最新的代码,而不是用update 有问题,问哥
- hdu1695 GCD2 容斥原理 求x属于[1,b]与y属于[1,d],gcd(x,y)=k的对数。(5,7)与(7,5)看作同一对。
GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...
- Vsphere日记02.ESXi5.5.configuration
2.Vsphere ESXi 5.5 configuration 步骤1:启动 ESXI 服务器 步骤2:按 F2 进入用户登录界面 输入用户名及密码,进入参数设置界面.密码为我安装时候设置的&quo ...
- OpenCV中Camshitf算法学习
今天上午,结合OpenCV自带的camshitf例程,简单的对camshitf有了一个大致的认识和理解,现总结如下: 1:关于HSV H指hue(色相).S指saturation(饱和度).V指val ...