Java线程(十三):BlockingQueue-线程的阻塞队列(二)

2014-11-24 09:39:53 · 作者: · 浏览: 5
put()线程就等待,只有当take()线程取走一个数据时才可以继续往队列中添加数据。运行结果如下(只去部分结果):
[java]
Thread-1准备放数据!
Thread-1已经放了数据,队列目前有1个数据
Thread-1准备放数据!
Thread-1已经放了数据,队列目前有2个数据
Thread-0准备放数据!
Thread-0已经放了数据,队列目前有3个数据
Thread-0准备放数据!
Thread-2准备取数据!
Thread-2已经取走数据,队列目前有2个数据

既然阻塞队列可以实现线程之间的等待,那么我们就可以通过两个具有1个空间的阻塞队列可以实现线程的同步,关键代码如下:
[java]
BlockingQueue queue1 = new ArrayBlockingQueue(1);
BlockingQueue queue2 = new ArrayBlockingQueue(1);
public void sub(int i){
try {
queue1.put(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j=1;j<=10;j++){
System.out.println("sub thread sequece of " + j + ",loop of " + i);
}
try {

queue2.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void main(int i){
try {
queue2.put(1);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for(int j=1;j<=100;j++){
System.out.println("main thread sequece of " + j + ",loop of " + i);
}
try {
queue1.take(); www.2cto.com
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

上例中定义了两个方法,一个sub()和一个main(),两个方法要实现同步,由于定义的两个阻塞队列都是容量为1,所以只要有一个queue1.put(1);那么sub()方法就必须等待,只有当main()方法中queue1.take();以后sub()方法才可以继续进行,main()方法也类似。