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