等待后解锁是如何发生的

axr492tv  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(219)

我写了一个小程序来交替打印奇偶数,但有一个问题:
因为线程应该在 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();
    }
}
bwleehnv

bwleehnv1#

在printeven()方法中添加以下行:在finally块中:

finally
        {
            condition.signal();
            if(i < 10)condition.await(); 
            rLock.unlock();
        }

通过添加这个条件,当i=10时,线程将不再等待。

相关问题