package testthread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 店员从生产者取货,消费者从店员取货,店员最多只能存放20个产品
* 这个实例使用lock来显示的定义锁
* @author Passenger
*
*/
//店员类
class Clerk2 {
int proNum;
final Lock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
//添加产品
public void addProduct(){
//显示调用lock锁住资源
lock.lock();
if(proNum>=20){
try {
//如果产品超过20件就停止生产
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放锁资源
lock.unlock();
}
}else{
proNum++;
System.out.println(Thread.currentThread().getName() + " 生产了产品,还剩下:.. " + proNum);
//生产了商品后唤醒消费者去消费
condition.signalAll();
//释放锁资源
lock.unlock();
}
}
//消费产品
public void conProduct(){
//显示调用lock锁住资源
lock.lock();
if(proNum<=0){
try {
//如果产品少于1一个,停止消费
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放锁资源
lock.unlock();
}
}else{
proNum--;
System.out.println(Thread.currentThread().getName() + " 消费了产品,还剩下: ......" + proNum);
//唤醒生产者生产
condition.signalAll();
//释放锁资源
lock.unlock();
}
}
}
//新建一个生产者类
class Productor2 implements Runnable{
//new一个clerk对象,用于操作clerk对象中的proNum
Clerk2 clerk = null;
public Productor2(Clerk2 clerk){
this.clerk = clerk;
}
@Override
public void run() {
while(true){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.addProduct();
}
}
}
//消费者类
class Consumer2 implements Runnable {
Clerk2 clerk = null;
public Consumer2(Clerk2 clerk){
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.conProduct();
}
}
}
public class TestLock {
public static void main(String[] args) {
Clerk2 clerk = new Clerk2();
Consumer2 consumer = new Consumer2(clerk);
Productor2 productor = new Productor2(clerk);
//生产者和消费者线程
Thread conThread1 = new Thread(consumer);
Thread conThread2 = new Thread(consumer);
Thread proThread1 = new Thread(productor);
Thread proThread2 = new Thread(productor);
//设置线程名
conThread1.setName("conThread1");
conThread2.setName("conThread2");
proThread1.setName("proThread1");
proThread2.setName("proThread2");
//开始执行多线程
conThread1.start();
conThread2.start();
proThread1.start();
proThread2.start();
}
}
使用lock对象显示的锁定资源
最新推荐文章于 2024-01-01 12:10:26 发布