Java多线程——IllegalMonitorStateException
来源:互联网 发布:路由器mac地址修改 编辑:程序博客网 时间:2024/06/10 15:01
Integer不能作为线程同步的对象。
今天学习了一下线程,用vector和Integer分别作了一个例子,但Integer老是非法异常,后查了一下,发现Integer不能作为线程同步的对象...
参考:http://www.cnblogs.com/maxupeng/archive/2011/07/12/2104769.html
一个错误的同步Integer的例子:
import org.apache.log4j.Logger;public class DemoForInteger extends Thread { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(DemoForInteger.class); Integer count = null; public DemoForInteger(Integer count) { this.count = count; } public void run() { logger.info("start"); synchronized (count) { // count>5的时候,线程开始等待 while (count <= 0) { try { count.wait(); // this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count--; } } public static void main(String[] args) throws InterruptedException { Integer count = 0; System.out.println(count); Integer THREAD_NUM = 10; DemoForInteger[] demos = new DemoForInteger[THREAD_NUM]; for (Integer i = 0; i < THREAD_NUM; i++) { demos[i] = new DemoForInteger(count); demos[i].start(); } for (Integer i = 1; i <= THREAD_NUM; i++) { synchronized (count) { logger.info("sub-count=" + count + "唤醒"); count ++; count.notify(); // this.notify(); Thread.sleep(1000); } } }}
结果:
[INFO ] 2015-04-22 20:10:57,777(0) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-3] start [INFO ] 2015-04-22 20:10:57,779(2) cn.cjp.spider.demo.DemoForInteger.main(DemoForInteger.java:47) –> [main] sub-count=0唤醒 Exception in thread "main" [INFO ] 2015-04-22 20:10:57,779(2) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-9] start [INFO ] 2015-04-22 20:10:57,779(2) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-8] start [INFO ] 2015-04-22 20:10:57,779(2) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-7] start [INFO ] 2015-04-22 20:10:57,778(1) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-6] start [INFO ] 2015-04-22 20:10:57,778(1) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-0] start java.lang.IllegalMonitorStateExceptionat java.lang.Object.notify(Native Method)at cn.cjp.spider.demo.DemoForInteger.main(DemoForInteger.java:49)[INFO ] 2015-04-22 20:10:57,778(1) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-2] start [INFO ] 2015-04-22 20:10:57,778(1) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-5] start [INFO ] 2015-04-22 20:10:57,778(1) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-1] start [INFO ] 2015-04-22 20:10:57,777(0) cn.cjp.spider.demo.DemoForInteger.run(DemoForInteger.java:20) –> [Thread-4] start
利用Vector做例子:
import org.apache.log4j.Logger;import java.util.Vector;public class DemoForVector extends Thread {/** * Logger for this class */private static final Logger logger = Logger.getLogger(DemoForVector.class);Vector<Long> pool = null;public DemoForVector(Vector<Long> vector) {this.pool = vector;}public void run() {logger.info("start");synchronized (pool) {if (pool.isEmpty()) {try {pool.wait();} catch (InterruptedException e) {e.printStackTrace();}}Long num = pool.remove(pool.size() - 1);logger.info("remove num=" + num);}}public static void main(String[] args) throws InterruptedException {Vector<Long> pool = new Vector<Long>();int THREAD_NUM = 10;DemoForVector[] forVectors = new DemoForVector[THREAD_NUM];for (int i = 0; i < THREAD_NUM; i++) {forVectors[i] = new DemoForVector(pool);forVectors[i].start();}for (int i = 0; i < THREAD_NUM; i++) {synchronized (pool) {Long num = System.currentTimeMillis();logger.info("add num=" + num);pool.add(num);pool.notify();Thread.sleep(1000);}}}}结果:
[INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-0] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704705717 [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-9] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-8] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-7] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-5] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-3] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-4] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-2] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-1] start [INFO ] 2015-04-22 20:11:45,717(0) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:20) –> [Thread-6] start [INFO ] 2015-04-22 20:11:46,722(1005) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-6] remove num=1429704705717 [INFO ] 2015-04-22 20:11:46,723(1006) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704706723 [INFO ] 2015-04-22 20:11:47,723(2006) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704707723 [INFO ] 2015-04-22 20:11:48,724(3007) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704708724 [INFO ] 2015-04-22 20:11:49,725(4008) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704709725 [INFO ] 2015-04-22 20:11:50,732(5015) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704710732 [INFO ] 2015-04-22 20:11:51,733(6016) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704711733 [INFO ] 2015-04-22 20:11:52,734(7017) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704712734 [INFO ] 2015-04-22 20:11:53,735(8018) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704713735 [INFO ] 2015-04-22 20:11:54,735(9018) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-1] remove num=1429704713735 [INFO ] 2015-04-22 20:11:54,742(9025) cn.cjp.spider.demo.DemoForVector.main(DemoForVector.java:47) –> [main] add num=1429704714742 [INFO ] 2015-04-22 20:11:55,743(10026) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-9] remove num=1429704714742 [INFO ] 2015-04-22 20:11:55,744(10027) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-8] remove num=1429704712734 [INFO ] 2015-04-22 20:11:55,744(10027) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-7] remove num=1429704711733 [INFO ] 2015-04-22 20:11:55,745(10028) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-5] remove num=1429704710732 [INFO ] 2015-04-22 20:11:55,746(10029) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-3] remove num=1429704709725 [INFO ] 2015-04-22 20:11:55,747(10030) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-4] remove num=1429704708724 [INFO ] 2015-04-22 20:11:55,748(10031) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-2] remove num=1429704707723 [INFO ] 2015-04-22 20:11:55,750(10033) cn.cjp.spider.demo.DemoForVector.run(DemoForVector.java:30) –> [Thread-0] remove num=1429704706723
之后,我会将做一个多线程爬虫项目,放在https://github.com/JPCui/cjp-spider,欢迎来喷
0 0
- Java多线程——IllegalMonitorStateException
- Java多线程锁异常:IllegalMonitorStateException
- java多线程应用中的java.lang.IllegalMonitorStateException异常
- java.lang.IllegalMonitorStateException翻译
- java.lang.IllegalMonitorStateException
- java IllegalMonitorStateException异常
- java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException
- 处理java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException
- java.lang.IllegalMonitorStateException异常
- 关于java.lang.IllegalMonitorStateException
- 关于java.lang.IllegalMonitorStateException
- 关于java.lang.IllegalMonitorStateException
- 关于java.lang.IllegalMonitorStateException
- 索尼笔记本 触摸屏 fn 快捷键处理
- Android studio导入开源项目
- eclipse出现的闪退
- 构造单链表--归并两个按值递增单链表
- 改写Spark JdbcRDD,支持自己定义分区查询条件(转)
- Java多线程——IllegalMonitorStateException
- Tomcat7 配置SSL
- 使用swipemenulistview实现列表的左右滑动
- json反序列化
- PyQt5学习笔记13----pyqt线程间通信
- iOS系统及客户端软件测试的基础介绍
- nyoj754 黑心医生 结构体优先队列
- 怎样了解存在---辩证唯物主义认识论
- myeclipse10配置maven