В действительности нет способа выделить определенный процент процессорного времени / памяти для данного потока.Вы можете понизить приоритет потока, чтобы он не насыщал все ресурсы:
int oldPriority = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// process your documents here
Thread.currentThread().setPriority(oldPriority);
Лучшим подходом, который, вероятно, приблизит вас к указанию процента, будет использование ExecutorService
с фиксированным числомпотоки и запустить всю вашу обработку документов через это.Если вы дадите ему половину от числа процессоров на вашем сервере, это фактически ограничит обработку документов до 50% процессорного времени сервера.Вы бы хотели, чтобы одноэлементная служба настраивала пул потоков следующим образом:
int threads = Runtime.getRuntime().availableProcessors() / 2;
ExecutorService service = Executors.newFixedThreadPool(threads);
Затем в своих веб-запросах вы могли бы передать Callable
, который реализует обработку документов, службе и блокировать ее до тех пор, пока она не будет выполнена.завершено:
Callable<Result> callable = new DocumentProcessorCallable<Object>(doc);
Result result = service.submit(callable).get();
Или вы можете предпочесть не блокировать и немедленно вернуться, предоставив реализацию Runnable
, которую вы передаете service.execute(runnable)
.См. ExecutorService для получения дополнительных примеров и документации.