2015-07-11 82 views
3

下午好一切,Java的信号灯停止线程

我与Java的信号量和并发工作的一个学校项目,并有关于它是如何工作的几个问题!

如果没有可用的许可证,我需要该线程退出“队列” - 不只是睡觉,直到准备就绪。这可能吗?正如你可以在我的try, catch, finally看 - 有没有处理此事件:

try { 
    semaphore.acquire(); 
    System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString()); 
    Thread.sleep(3000); 
} 
catch (InterruptedException e) { 
    e.printStackTrace(); 
} finally { 
    semaphore.release(); 
    System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString()); 
} 

丹尼尔带来了tryAquire功能 - 这看起来不错,但我已阅读状态的教程,信号灯需要try, catch, finally块,以防止死锁。我的当前代码(实现0​​)将在finally块中发布,即使该线程从未获取。你有什么建议吗?

public void seatCustomer(int numBurritos) { 
    try { 
     if(semaphore.tryAcquire()) { 
      System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString()); 
      Thread.sleep(3000); 
     } else { 
      System.out.println(Thread.currentThread().getName() + " left due to full shop"); 
     } 

    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     semaphore.release(); 
     System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString()); 
    } 
} 

回答

4

我建议你阅读JavaDoc中Semaphor。特别是,看看tryAcquire方法。

只有在调用时有可用信号量的情况下才从该信号中获取许可。

获取许可证(如果有许可证并立即返回,值为true),将可用许可证数减1。

如果没有许可证可用,则此方法将立即返回false值。

这是什么意思是你可以尝试获得许可证,如果有的话。如果没有可用的,这个方法立即返回false而不是阻塞。

你必须让你的“终于”阻止一点智慧。

boolean hasPermit = false; 
try { 
    hasPermit = semaphore.tryAcquire(); 
    if (hasPermit) { 
     // do stuff. 
    } 
} finally { 
    if (hasPermit) { 
     semaphore.release(); 
    } 
} 
+0

谢谢丹尼尔!这是我一直在玩,但我的try/catch/finally块释放从未获得的线程=/ –

+0

我已更新我的答案,包括如何在finally块中处理它。 – Daniel

+0

这是门票 - 非常感谢你的帮助@Daniel –