Задумывались ли вы об использовании sleep для остановки потоков перед тем, как перейти к удаленному вызову?Вы можете сделать так, чтобы потоки спали в течение случайного количества секунд между 1 и 5, что ограничивало бы количество потоков, обращающихся к методу в любое время.
Вы также можете установить lock на метод, срок действия которого истекает через 1 секунду, чтобы каждый поток «захватывает» блокировку, выполняет метод, но срок его блокировки истекает, поэтому следующий поток может его захватить.и выполнить.Установите блокировку в начале метода - и пусть он ничего не делает, кроме как удерживает поток в течение одной секунды thread.sleep(1000)
, а затем продолжает выполнение.Это ограничит вас одним потоком, попадающим в метод за раз.
РЕДАКТИРОВАТЬ: Ответ на комментарий ОП ниже
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
thread.sleep(1000) //added to example by floppydisk.
} finally {
lock.unlock()
doYourConnectionHere();
}
}
}
Изменено с: ReentrantLock .Внутри try / catch все, что вы делаете, это thread.sleep (1000) вместо того, чтобы что-то делать.Затем он снимает блокировку для следующего потока и продолжает выполнять оставшуюся часть тела метода - в вашем случае соединение с удаленным сервером.