您的位置:首页 > 编程语言 > Java开发

java5条件阻塞Condition的应用(十三)

2015-02-09 21:40 393 查看
 notify和wait必须在sychroized里面写不然会报错

condition就是用来代替wait和notify的







public class ConditionCommunication {

/**
* @param args
* notify和wait必须在sychroized里面写不然会报错

*这个condition就是用来代替wait 和notify的,我们为什么要学习这个新技术也,现在我们说一个例子它能帮我们实现以前实现不了的
*看图20150388(这个事例是发短信的事例),然后我们看jdk的帮助文档,这里面已经帮我们实现 实现一个可阻塞的队列了,现在我们看图片033为什么要使用两个conditaion,使用一人个condiation的时候会出现什么问题也
*现在我们来分析一下,比如现在有5个线程,现在队列已经满了,有5个在等待,然后有另外一个线程拿走了一个数据,然后通知另外5个线程中的一个可以放数据了,然后其实一个放完数据了,又要通知其他拿的线程拿数据
*,这个时候由于是在放的通知的,这个时候使用的condiation是同一个只能唤醒这4个等待中的一个,所以这时候出问题了,这就是为什么要使用2个condation的原因
*现在我们来做一个例子,实现老大唤醒老二,老二唤醒老三,老三唤醒老大,这个需要三个condiation   ThreeConditionCommunication
*
*/
public static void main(String[] args) {

final 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 {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
 private boolean bShouldSub = true;
 public  void sub(int i){
 lock.lock();
 try{
 while(!bShouldSub){
 try {
condition.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }
for(int j=1;j<=10;j++){
System.out.println("sub thread sequence of " + j + ",loop of " + i);
}
 bShouldSub = false;
 condition.signal();
 }finally{
 lock.unlock();
 }
 }
 
 public  void main(int i){
 lock.lock();
 try{
while(bShouldSub){
  try {
condition.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
bShouldSub = true;
condition.signal();
 }finally{
 lock.unlock();
 }
 }

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

现在我们使用三个condition来实现

public class ThreeConditionCommunication {

/**
* @param args
*/
public static void main(String[] args) {

final Business business = new Business();
new Thread(
new Runnable() {

@Override
public void run() {

for(int i=1;i<=50;i++){
business.sub2(i);
}

}
}
).start();

new Thread(
new Runnable() {

@Override
public void run() {

for(int i=1;i<=50;i++){
business.sub3(i);
}

}
}
).start();

for(int i=1;i<=50;i++){
business.main(i);
}

}

static class Business {
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
 private int shouldSub = 1;
 public  void sub2(int i){
 lock.lock();
 try{
 while(shouldSub != 2){
 try {
condition2.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }
for(int j=1;j<=10;j++){
System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
}
 shouldSub = 3;
 condition3.signal();
 }finally{
 lock.unlock();
 }
 }

 public  void sub3(int i){
 lock.lock();
 try{
 while(shouldSub != 3){
 try {
condition3.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }
for(int j=1;j<=20;j++){
System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
}
 shouldSub = 1;
 condition1.signal();
 }finally{
 lock.unlock();
 }
 }  
 
 public  void main(int i){
 lock.lock();
 try{
while(shouldSub != 1){
  try {
condition1.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
shouldSub = 2;
condition2.signal();
 }finally{
 lock.unlock();
 }
 }

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: