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