1.一个例子
- 用两个具有1个空间的队列来实现同步通知的功能
- 两个线程,你一下我一下,你来我往
- 以前写过一个类似的
- 用阻塞队列来实现这个功能
2.分析
3.实例
public class BlockingQueueCommunication {
public static void main(String[] args) {
Business business = new Business();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=50;i++) {
business.sub(i);
}
}
}).start();
for(int i=1;i<=50;i++) {
business.main(i);
}
}
static class Business{
BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
{//匿名构造方法,对象创建几次就调用几次
try {
queue2.put(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sub(int i) {
try {
queue1.put(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
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();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 为什么用匿名构造方法,而不用静态代码块?
- 用静态代码块是不能创建对象的
- 静态代码块是运行类加载之后运行一次
- 而匿名构造方法运行是在所有的构造方法之前