- import java.util.Random;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class ConditionDemo {
- private final Lock lock = new ReentrantLock();
- private final Condition isFull = lock.newCondition();
- private final Condition isEmtry = lock.newCondition();
- private String[] data = new String[10];
- private int len, getStr,putStr;
- private StringBuilder buff = new StringBuilder();
- public void putData(){
- lock.lock();
- System.out.println("正在填充数据...");
- try{
- while(len==data.length){
- System.out.println(Thread.currentThread().getName()+" 填充完毕..."); // 这里无法打印
- putStr=buff.length();
- try{
- isFull.await();
- }catch(InterruptedException e){
- System.err.println(e.toString());
- }
- }
- while(putStr<=data.length){
- if(putStr==data.length){
- putStr = 0;
- break;
- }
- data[putStr] = String.valueOf(new Random().nextInt(100));
- System.out.println("data["+putStr+"]="+data[putStr]);
- ++putStr;
- ++len;
- }
- isEmtry.signal();
- }finally{
- lock.unlock();
- }
-
- }
- public void getData(){
- lock.lock();
- System.out.println("正在截获信息..."); // 运行到这里,卡住了
- try{
- while(len==0){
- System.out.println(Thread.currentThread().getName()+"截获数据完毕...");
- System.out.println(buff.toString());
- try {
- isEmtry.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- while(getStr<=data.length){
- if(getStr==data.length){
- getStr = 0;
- break;
- }
- String info = data[getStr];
- buff.append(info+",");
- ++getStr;
- --len;
- }
- isFull.signal();
- }finally{
- lock.unlock();
- }
- }
- public static void main(String[] args) {
- final ConditionDemo condition = new ConditionDemo();
- final CountDownLatch latch = new CountDownLatch(1);
-
- new Thread(new Runnable(){
-
- @Override
- public void run(){
- condition.putData();
- latch.countDown();
- }
- }).start();
-
- try {
- latch.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- condition.getData();
- }
- }
复制代码 |
|