Java并发锁正确终止线程

时间:2015-04-26 21:11:21

标签: java multithreading concurrency locking monitor

我有一个小应用程序,可以使用以下类“模拟”共享打印机系统。

所有线程共享的监视器具有以下方法。 一个reentrantlock锁和下一个方法。

public void lock()
{
    lock.lock();
}



public  void unlock()
{  
    lock.unlock();       
}


    public synchronized void refillPaper() {

    while(FullTray())
    {
        try
        {
            this.unlock();
            wait(7000);
            this.lock();
        }
        catch(InterruptedException ex){}
    }

    setPaperLevel(getPaperLevel() - 50);

    System.out.println("Printer refiled");


}


public synchronized void print()
{
    while(!CanPrint())
    {   
        try
        {     
            this.unlock();
            wait();
            this.lock();
        }
        catch(InterruptedException ex)
        {}    
    }
     System.out.println(getPaperLevel()); 
}

然后线程:用户和技术

用户线程运行方法:

public void run()
{

    Printer.lock(); // the lock() method using the reentrant lock
    System.out.println(this.getNames() + "locked");
    for( int i = 0; i< 4; i++)
    {     
         Printer.print();
         try
         {
             sleep(1000);
         }
         catch(InterruptedException ex) 
         {}
    }
    Printer.unlock();
    System.out.println(this.getNames + " released");
}

用户Tech thread。

public void run()
{
    laserPrinter.lock();
    System.out.println("Paper tech acquired the printer: ");

    for(int i = 0;  i < 3; i++)
    {
        Printer.AddPaper();
        try
        {
            sleep(1000);
        }
        catch(InterruptedException ex)
        {}
    }
    Printer.unlock();
    System.out.println("tech released");
}

ThreadGroup users = new ThreadGroup("Users");
ThreadGroup techs = new ThreadGroup("Techs");

Printer printer = new Printer();
User user1 = new User(users,printer);
User user2 = new User(users,printer);
User user3 = new User(users,printer);
User user4 = new User(users,printer);
Tech tech = new Tech(techs, printer);

当线程锁定打印机时,我希望将其锁定,直到for循环结束。 目前我遇到以下情况:

用户调用printer.Print()4次如果纸张用完则技术线程应该锁定显示器并重新填充纸张,但是其他用户线程访问它而不是技术线程(user1 - &gt; user2(锁定)没有纸张?发布) - &gt; user3(锁定没有纸张?发布)并释放,直到线程获得它并重新填充纸张然后没有任何反应。

或者如果有足够的纸张供用户打印,如果技术线程是最后一个并且条件为假则它将等待无限而不是停止。

我认为我弄乱了锁定打印机的方式?

@ Patricia Shananan,表达得很厉害。 Printer类是监视器,并提供Print()和AddPaper()方法。 在User线程的run()方法中,我调用Print()4次(使用for循环)。在Tech线程的run()方法中,我调用AddPaper()方法(对于时间)

每次调用Print()方法时,都会修改纸张级别。 如果纸张低,则应解锁显示器。 一旦解锁,通常监视器通常由另一个User类型的线程获取。这将导致获取监视器的线程释放它。这将发生在由Tech类型的线程获取监视器之前。但是在消耗了技术线程之后(AddPaper会增加纸张级别)没有任何反应。它不应该返回并运行获取的其他线程并释放监视器,然后才能运行Print()方法。

0 个答案:

没有答案