多线程——在java中,有没有一种方法可以在另一个线程实际被阻塞后通知另一个线程您已经进行了阻塞调用?

gpnt7bae  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(382)

blockAndDoSomeLongWork() 是一种阻塞的方法。通常,我们会在另一个线程上执行:

someExecutorService.execute(() -> {
    blockAndDoSomeLongWork();
});

问题是:有没有办法通知我调用的线程 blockAndDoSomeLongWork() 之后的事实,这样我将绝对肯定,其他线程不会做任何事情之前 blockAndDoSomeLongWork() 有人打过电话吗?如果我只是通过调用前面的lambda的身体来唤醒另一个线程 blockAndDoSomeLongWork() ,这使得另一个线程可以在 blockAndDoSomeLongWork() 这是我想要避免的。

jtoj6r0c

jtoj6r0c1#

使用信号量:

Semaphore sema = new Semaphore(0);

此线程:

someExecutorService.execute(() -> {
    blockAndDoSomeLongWork();
    sema.release();
});

其他线程:

sema.acquire();
// when we get here, the 'long work' has completed

这假设只有一个“其他”线程,更微妙的是,假设“长期工作”是一次性的。否则,您可能需要双向联锁。

q8l4jmvw

q8l4jmvw2#

不,这是不可能的。很难想象你为什么会需要它。
假设有一个notifyotherthreadandblock()调用。
此调用将通知另一个线程,然后阻塞。
但是,这个调用中有代码。它通知另一个线程,然后阻塞。如果您的线程在通知之后、阻塞之前停止,该怎么办?这与您已经遇到的问题相同。把它放到函数中并不能解决任何问题。
现在,这在理论上是可能的。也许操作系统可以有一个函数,上面写着“嘿,下次我阻塞时,请帮我通知另一个线程。”但是操作系统没有这个函数。为什么不呢?因为它没用。您应该在开始阻塞之前通知另一个线程,因为这没有任何区别。
如果它确实起到了作用,那么您的代码就做错了,您应该更好地解释您的情况,这样我们就可以解释如何做到这一点,这样您就可以在阻塞之前通知。

相关问题