У меня есть два потока, которые хотят синхронизировать один и тот же объект. Thead A
должен иметь возможность прерывать поток B
, если определенное условие было выполнено. Вот некоторый псевдокод того, что два потока делают / должны делать.
A:
public void run()
{
while(true)
{
//Do stuff
synchronized(shared)
{
//Do more stuff
if(condition)
{
B.interrupt();
}
}
}
}
B
public void run()
{
while(true)
{
try
{
//Do stuff
synchronized(shared)
{
//Do more stuff
}
}
catch(InterruptedException e)
{
continue;
}
}
}
Вот ситуация, которую я не могу разрешить:
- Тема
A
захватывает общий ресурс и делает что-то еще.
- Тем временем поток
B
достигает синхронизированного блока и ожидает, пока A
освободит свой общий ресурс.
- Поток
A
, делая что-то, понял, что Поток B не должен иметь общего ресурса, и пытается прервать Поток B
. Но нить B
уже превзошла точки, в которые можно было бы бросить InterruptedException
.
У меня вопрос, есть ли способ прервать поток, пока он ожидает, чтобы быть synchronized
на чем-то?