说 blockAndDoSomeLongWork()
是一种阻塞的方法。通常,我们会在另一个线程上执行:
someExecutorService.execute(() -> {
blockAndDoSomeLongWork();
});
问题是:有没有办法通知我调用的线程 blockAndDoSomeLongWork()
之后的事实,这样我将绝对肯定,其他线程不会做任何事情之前 blockAndDoSomeLongWork()
有人打过电话吗?如果我只是通过调用前面的lambda的身体来唤醒另一个线程 blockAndDoSomeLongWork()
,这使得另一个线程可以在 blockAndDoSomeLongWork()
这是我想要避免的。
2条答案
按热度按时间jtoj6r0c1#
使用信号量:
此线程:
其他线程:
这假设只有一个“其他”线程,更微妙的是,假设“长期工作”是一次性的。否则,您可能需要双向联锁。
q8l4jmvw2#
不,这是不可能的。很难想象你为什么会需要它。
假设有一个notifyotherthreadandblock()调用。
此调用将通知另一个线程,然后阻塞。
但是,这个调用中有代码。它通知另一个线程,然后阻塞。如果您的线程在通知之后、阻塞之前停止,该怎么办?这与您已经遇到的问题相同。把它放到函数中并不能解决任何问题。
现在,这在理论上是可能的。也许操作系统可以有一个函数,上面写着“嘿,下次我阻塞时,请帮我通知另一个线程。”但是操作系统没有这个函数。为什么不呢?因为它没用。您应该在开始阻塞之前通知另一个线程,因为这没有任何区别。
如果它确实起到了作用,那么您的代码就做错了,您应该更好地解释您的情况,这样我们就可以解释如何做到这一点,这样您就可以在阻塞之前通知。