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