下面是两个类:
package concurrent.asyn;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class Subject {
private String privateStr;
public String publicString;
String defaultStr;
protected String protectedStr;
BlockingQueue<String> bq = new ArrayBlockingQueue<String>(10, true);
int x = 10;
public synchronized void product(){
String random = getRan();
bq.add(random);
System.out.println(Thread.currentThread().getName()+" 生产了 " +random + " 总共有 "+bq.size());
//this.notify();
}
public synchronized void consume(){
String remove = "空";
if(bq.isEmpty()){
try {
System.out.println(Thread.currentThread().getName()+" 准备等待 ....");
this.wait();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//System.out.println(Thread.currentThread().getName()+" 等待中 ....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
this.notify();
remove = bq.remove();
}
System.out.println(Thread.currentThread().getName()+" 消费了 " +remove+" 还剩余 "+bq.size());
}
public String getRan(){
String ran = UUID.randomUUID().toString();
return ran;
}
public static void main(String[] args) {
Subject sj = new Subject();
System.out.println(sj.bq);
}
private void privateFun(){
System.out.println("private ... ");
}
protected void protectedFun(){
System.out.println("protected ... ");
}
void defaultFun(){
System.out.println("default ... ");
}
}
package concurrent.asyn;
public class TestThread {
public static void main(String[] args) {
Subject sj = new Subject();
for(int i = 0 ;i <2 ; i++){
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 生产开始了 ");
for(int p = 0;p < 3 ;p++){
sj.product();
}
System.out.println(Thread.currentThread().getName()+" 生产结束了 ");
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 消费开始了 ");
for(int p = 0;p < 3 ;p++){
sj.consume();
}
System.out.println(Thread.currentThread().getName()+" 消费结束了 ");
}
}).start();
}
try {
//System.out.println(" 准备 sleep .....");
Thread.sleep(2000);
//System.out.println(" 完成 sleep .....");
//Thread.currentThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" 最终剩余 >>>>>> " + sj.bq.size());
}
}
下面是几个测试结果: