论坛首页 编程语言技术论坛

多线程之ReentrantLock 和 Condition

浏览 1074 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-12-15  
<pre name="code" class="java">
package com.test3;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 线程通信例子(基于可重入锁ReentrantLock,一对Condition实现)
* */
public class PC2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Q2 q = new Q2();
        new Producer2(q);
        new Customer2(q);
    }
}
/**
* 阻塞队列
* */
class Q2{
    int n;
    final Lock lock = new ReentrantLock();
    //说明:canGet和canPut可以合并成一个
    final Condition canGet = lock.newCondition();
    final Condition canPut = lock.newCondition();
    boolean valueSet = false;
    
    int get(){
        //实现可响应中断的锁
        try {
            lock.lockInterruptibly();
            //值未设置好,循环等待
            while(!valueSet){
                canGet.await();
            }
            //取值成功
            System.out.println("Got:"+n);
            //将设置标志置为false
            valueSet = false;
            Thread.currentThread().sleep(1000);
            //通知设值线程
            canPut.signal();
            return n;
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }finally{
            lock.unlock();
        }
        return 0;
    }
    void put(int n){
        try {
            //实现可响应中断的锁
            lock.lockInterruptibly();
            //已经设置好了值,而且未被取走,循环等待
            while(valueSet){
                canPut.await();
            }
            this.n = n;
            //将设置标志设置为true
            valueSet = true;
            System.out.println("Put:"+n);
            Thread.currentThread().sleep(1000);
            //通知取值线程,可以取值
            canGet.signal();//相当于notify() ,signalAll()相当于notifyAL
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}
/**
* 生产者
* */
class Producer2 implements Runnable{
    Q2 q;
    public Producer2(Q2 q){
        this.q = q;
        new Thread(this,"Producer").start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        int i=0;
        while(true){
            q.put(i++);
        }
    }
}
/**
* 消费者
* */
class Customer2 implements Runnable{
    Q2 q;
    public Customer2(Q2 q){
        this.q=q;
        new Thread(this,"Customer").start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            q.get();
        }
    }
}


</pre>
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics