ConcurrentHashMap в этом коде служит нескольким целям:
1. Потокобезопасность:`ConcurrentHashMap`
обеспечивает безопасное выполнение нескольких операций в многопоточной среде без необходимости внешней синхронизации.
2. Управление задачами: Мапа хранит задачи (`TimerTask`
), которые должны быть выполнены. Ключ в мапе позволяет идентифицировать и управлять конкретными задачами. Если новая задача приходит с тем же ключом, старая задача может быть либо заменена, либо "продлена", в зависимости от логики в методе`call`
.
3. Гранулярность блокировки: комментарий автора кода указывает на это. Блокировка на уровне ключа позволяет разным потокам работать с разными ключами одновременно, не блокируя друг друга.
Таким образом, мапа здесь служит для хранения задач, ассоциированных с определенными ключами, и обеспечения потокобезопасного доступа и управления этими задачами.
Что касается вашего вопроса о ключе: ключ здесь действительно нужен для идентификации задачи в мапе. Если бы ключа не было, невозможно было бы управлять отдельными задачами. Сам класс`Debouncer`
действительно имеет один коллбек, но он может управлять множеством задач, каждая из которых идентифицируется ключом.
@echo off
setlocal enabledelayedexpansion
REM Читаем каждую строку из файла file.txt
for /f "tokens=*" %%i in (file.txt) do (
REM Разбиваем строку на отдельные элементы
for %%j in (%%i) do (
REM Создаем папку с соответствующим именем
mkdir %%j 2>nul
REM Создаем файл в этой папке с тем же именем
<nul (set /p=%%j) > %%j\%%j.txt
)
)
echo Done.
pause
local counter = 46;
local function CheckCounter()
counter = counter + 1;
return counter;
end
function findSequence(arr) {
let maxSequence = [];
let currentSequence = [];
for (let i = 1; i < arr.length - 1; i++) {
const currentValue = parseInt(arr[i].value, 10);
const prevValue = parseInt(arr[i - 1].value, 10);
const nextValue = parseInt(arr[i + 1].value, 10);
if (prevValue > currentValue && currentValue < nextValue) {
currentSequence = [arr[i]];
} else if (currentSequence.length > 0 && currentValue < nextValue) {
currentSequence.push(arr[i]);
} else {
currentSequence = [];
}
if (currentSequence.length > maxSequence.length) {
maxSequence = currentSequence.slice();
}
}
if (currentSequence.length > 0 && parseInt(arr[arr.length - 1].value, 10) > parseInt(arr[arr.length - 2].value, 10)) {
currentSequence.push(arr[arr.length - 1]);
if (currentSequence.length > maxSequence.length) {
maxSequence = currentSequence.slice();
}
}
return maxSequence;
}
let arr1 = [{ value: '2' }, { value: '4' }, { value: '11' }, { value: '7' }, { value: '8' }, { value: '9' }];
let arr2 = [{ value: '5' }, { value: '20' }, { value: '5' }, { value: '7' }, { value: '9' }, { value: '11' }];
console.log(findSequence(arr1)); // (7, 8, 9)
console.log(findSequence(arr2)); // (5, 7, 9, 11)