等待后如何解锁
How is unlock happening after await
我写了一个小程序来交替打印奇偶数,但有一个问题:
既然线程应该在 await
调用处等待,那么重入锁是如何解锁的?
public class Worker implements Runnable
{
private ReentrantLock rLock = null;
private Condition condition = null;
private String name;
volatile static boolean isEvenTurn = true;
public Worker(String name, ReentrantLock rLock, Condition condition)
{
this.name = name;
this.rLock = rLock;
this.condition = condition;
}
@Override
public void run()
{
try
{
if(name.equals("ODD"))
printOdd();
else
printEven();
}
catch(Exception e) { e.printStackTrace();}
}
private void printOdd() throws Exception
{
while(isEvenTurn);
for(int i=1;i<10;i+=2)
{
try
{
rLock.lock();
System.out.println(i);
}
catch(Exception e) {e.printStackTrace();}
finally
{
condition.signal();
condition.await();
rLock.unlock();
}
}
}
private void printEven() throws Exception
{
for(int i=0;i<10;i+=2)
{
try
{
rLock.lock();
System.out.println(i);
isEvenTurn = false;
}
catch(Exception e) {e.printStackTrace();}
finally
{
condition.signal();
condition.await();
rLock.unlock();
}
}
}
public static void main(String[] args)
{
ReentrantLock rLock = new ReentrantLock();
ExecutorService service = Executors.newFixedThreadPool(2);
Condition c = rLock.newCondition();
Worker oddPrinter = new Worker("ODD",rLock,c);
Worker evenPrinter = new Worker("EVEN",rLock,c);
service.execute(evenPrinter);
service.execute(oddPrinter);
service.shutdown();
}
}
在 printEven() 方法中添加这一行:在 finally 块中:
finally
{
condition.signal();
if(i < 10)condition.await();
rLock.unlock();
}
通过添加此条件,当您
i = 10 你的线程不会再等待了。
我写了一个小程序来交替打印奇偶数,但有一个问题:
既然线程应该在 await
调用处等待,那么重入锁是如何解锁的?
public class Worker implements Runnable
{
private ReentrantLock rLock = null;
private Condition condition = null;
private String name;
volatile static boolean isEvenTurn = true;
public Worker(String name, ReentrantLock rLock, Condition condition)
{
this.name = name;
this.rLock = rLock;
this.condition = condition;
}
@Override
public void run()
{
try
{
if(name.equals("ODD"))
printOdd();
else
printEven();
}
catch(Exception e) { e.printStackTrace();}
}
private void printOdd() throws Exception
{
while(isEvenTurn);
for(int i=1;i<10;i+=2)
{
try
{
rLock.lock();
System.out.println(i);
}
catch(Exception e) {e.printStackTrace();}
finally
{
condition.signal();
condition.await();
rLock.unlock();
}
}
}
private void printEven() throws Exception
{
for(int i=0;i<10;i+=2)
{
try
{
rLock.lock();
System.out.println(i);
isEvenTurn = false;
}
catch(Exception e) {e.printStackTrace();}
finally
{
condition.signal();
condition.await();
rLock.unlock();
}
}
}
public static void main(String[] args)
{
ReentrantLock rLock = new ReentrantLock();
ExecutorService service = Executors.newFixedThreadPool(2);
Condition c = rLock.newCondition();
Worker oddPrinter = new Worker("ODD",rLock,c);
Worker evenPrinter = new Worker("EVEN",rLock,c);
service.execute(evenPrinter);
service.execute(oddPrinter);
service.shutdown();
}
}
在 printEven() 方法中添加这一行:在 finally 块中:
finally
{
condition.signal();
if(i < 10)condition.await();
rLock.unlock();
}
通过添加此条件,当您 i = 10 你的线程不会再等待了。