我们可以使用wait等操作控制线程协调工作,可是当我们的代码中没有同步监视器的时候,上述的办法就不能使用了。比如我们使用的lock对象来控制线程的同步。
lock中提供了Condition来让我们可以方便的控制线程协调工作。例如上述的取钱,存钱的例子,我们可以获得两个条件变量,获取的方法是lock.newCondition();
对于上述例子,我们创建Condition notwithdraw = lock.newCondition();
和 Condition notdesopit = lock.newCondition();
当flag=false的时候,notwithdraw.await();当取完钱之后,notdesopit.signal();
当flag=true的时候, notdesopit.await(); 当存完钱之后,notwithdraw.signal();
以下是代码:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
class Account{
int blance;
boolean flag =false;
//创建可重入锁
final ReentrantLock lock = new ReentrantLock();
//获得指定lock对象对应的条件变量
final Condition notwithdraw = lock.newCondition();
final Condition notdesopit = lock.newCondition();
public Account(int blance) {
super();
this.blance = blance;
}
public int getBlance() {
return blance;
}
public void setBlance(int blance) {
this.blance = blance;
}
//定义取款操作
public void withdraw(int money)
{
lock.lock();
try
{
if(flag==false)
{
try {
notwithdraw.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
System.out.println("我正在取钱");
flag =false;
notdesopit.signal();
}
}
finally
{
lock.unlock();
}
}
//定义存钱
public void desopit()
{
lock.lock();
try
{
if(flag)
{
try {
notdesopit.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
System.out.println("我正在存钱");
flag=true;
notwithdraw.signal();
}
}
finally
{
lock.unlock();
}
}
}
class Product extends Thread
{
Account a;
public Product(Account a) {
super();
this.a = a;
}
@Override
public void run() {
//存钱
for(int i=0;i<100;i++)
{
a.desopit();
}
}
}
class Consumer extends Thread
{
Account a;
public Consumer(Account a) {
super();
this.a = a;
}
public void run() {
//取现
for(int i=0;i<100;i++)
{
a.withdraw(100);
}
}
}
public class Testhezuo {
public static void main(String[] args) {
Account a = new Account(0);
Consumer c1= new Consumer(a);
c1.start();
Consumer c2= new Consumer(a);
c2.start();
Consumer c3= new Consumer(a);
c3.start();
Product p = new Product(a);
p.start();
}
}