我有一个小应用程序,可以使用以下类“模拟”共享打印机系统。
所有线程共享的监视器具有以下方法。 一个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()方法。