Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

Java多线程——IllegalMonitorStateException

$
0
0

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.IllegalMonitorStateException  
    at 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,欢迎来喷


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>