Сервлеты по определению должны быть поточно-ориентированными. Tomcat (или любой другой контейнер сервлета) внутренне содержит пул потоков, которые будут выполнять ваши запросы. Поэтому я не вижу особого смысла в создании собственных потоков (конечно, если мы говорим о не очень сложных вычислениях). Чтобы сделать ваш класс безопасным для потока, есть несколько вариантов: общие методы синхронизации (например, synchronized / wait / notify) или более высокоуровневые структуры (см. Пакет java .util.concurrent). Следует избегать других общих не поточно-ориентированных объектов, таких как ArrayLists. Как я понимаю, вы хотите выполнять не более 2-х потоков одновременно. Вы написали «3-й запрос должен быть обработан в завершенном потоке» - мне кажется, что нецелесообразно, если вы в состоянии выполнить все необходимые вычисления в своих потоках сервлета. Ниже приведен фрагмент, использующий java .util.concurrent.Semaphore - класс, который позволяет обрабатывать только n потоков за один раз, где n - количество разрешений.
public class Home extends HttpServlet {
private final Semaphore semaphore = new Semaphore(2);
protected void service(HttpServletRequest request, HttpServletResponse response) {
try {
semaphore.acquire();
// Do what you need
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
semaphore.release();
}
}
}
UPD: пример загрузчика
Представим, что у вас есть форма с полем и кнопкой отправки. При нажатии ожидается некоторое продолжительное действие, поэтому вы хотите показать пользователю загрузочный gif.
Часть html файла:
<form>
<label for="content">Enter value:</label>
<input id="content" type="text" name="content">
<button id="submitBtn" type="submit">Send</button>
<img id="loader" style="display:none" src="../static/img/loading.gif">
</form>
JS (с использованием jQuery) :
function sendRequest(content) {
var payload = {};
payload.content = content;
return $.ajax({
type: 'POST',
contentType: "application/json",
url: '/your-endpoint',
data: JSON.stringify(payload)
})
}
$("#submitBtn").click(function () {
$('#loader').show();
$('#submitBtn').prop('disabled', true);
const response = sendRequest($('#content').val());
response.then((result) => {
$('#loader').hide();
$('#submitBtn').prop('disabled', false);
$('#content').val("");
alert(result);
}).catch(error => {
$('#loader').hide();
$('#submitBtn').prop('disabled', false);
$('#content').val("");
alert(error);
});
return false;
});
Надеюсь, это поможет.