假设我有线程t1,t2,t3 ...... t10并且我需要访问打印机和扫描仪,顺序是先扫描然后使用这个线程打印所以如何确保t1,t2 .. .t10(由多个用户)可以访问扫描仪或打印机而不会出现死锁。
t1完成扫描和等待打印机的工作,现在t2正在完成打印文档的工作。那么我该如何确保t1不应该中断作业t2。现在t2完成了他的打印工作,同一个用户想扫描另一个文件,但t1没有发布。所以t1和t2之间的死锁,t1想要打印机,而t2想要扫描仪,但他们已经拥有其他资源。
答案 0 :(得分:4)
t1完成扫描和等待打印机的工作,现在t2正在完成打印文档的工作。那么我该如何确保t1不应该中断作业t2。
实现这种机制的一个好方法是使用队列,例如线程安全BlockingQueue并且有2个消费者线程:
然后你的T0 ... T10只是将作业放在其中一个队列中,等待(或不等待)它们在打印机/扫描仪就绪时执行。
通过这样做,您无需锁定客户端/生产者端,并让消费者端(打印机和扫描仪)管理他们的工作。
答案 1 :(得分:3)