Невозможно сделать точно то, что вы сказали (проверьте, находятся ли другие потоки внутри метода напрямую).
Однако это звучит как классический случай для синхронизация .Сделайте синхронизацию вызова метода на мониторе какого-либо объекта;Сделайте ваш код очистки синхронизировать на том же мониторе, и вуаля!Теперь, если любой поток выполняет методы, которые вы синхронизировали, ваш код очистки не может быть запущен, но будет ждать, пока все потоки не выйдут из методов, а затем продолжат работу.
Вот пример:
public class Foo
{
private final Object LOCK = new Object();
public void importantMethodOne()
{
synchronized(LOCK)
{
// Method body here
}
}
public void importantMethodTwo()
{
synchronized(LOCK)
{
// Method body here
}
}
public void otherMethod()
{
// Method body here
}
public void cleanupMethod()
{
synchronized(LOCK)
{
// Method body here
}
}
}
Монитор LOCK является мьютексом - только один поток может удерживать его одновременно, поэтому только один поток может вызывать любой из важныйMethodOne, ImportantMethodTwo или cleanupMethod одновременно,Любые потоки, которые пытаются вызвать любой из этих методов, пока другой находится в области действия (и, следовательно, имеет блокировку), будут ожидать.В этом примере otherMethod может быть вызван в любое время, не прерывая что-либо еще, потому что он не получает блокировку.
Обратите внимание, что в этом случае два потока не могут выполнить myMethod () одновременно, потому что они будутблоки друг друга .Если это проблема, вы можете обойти это с помощью ReadWriteLock (который позволяет многим «читателям» удерживать ее одновременно, кроме одного «писателя»).Если вы получите блокировку чтения для ваших «обычных» методов и блокировку записи для ваших «очистительных» методов, это будет иметь желаемую семантику.