Создание потоков (NEWTHREAD, NEWEXECUTOR)
Оператор создания нового потока позволяет выполнить действие в другом, отличным от текущего, потоке.
По умолчанию, в нов ом потоке действие выполняется один раз, сразу же после создания этого потока. Однако, при необходимости, действие можно выполнить с заданной задержкой и/или выполнять постоянно через определенный интервал времени.
Также действие можно выполнить в новом потоке от имени заданного подключения (например некоторого пользователя). В этом случае внутри действии могут присутствовать операторы взаимодействия с пользователем, в том числе открытие формы в интерактивном представлении (по умолчанию при использовании этих операторов платформа выдаст ошибку).
Задержка, интервал и подключение в этом операторе задаются как некоторые свойства.
Создание пула потоков
Иногда количество одновременно выполняющихся потоков необходимо ограничить некоторым значением (как правило это делается если выполняемые действия не критичны и момент времени когда они завершатся не так важен). Для реализации такой функциональности в платформе существует оператор создания нового пула потоков. Этот оператор позволяет выполнить действие таким образом, что все создаваемые внутри этого действия новые потоки будут попадать в созданный этим оператором пул потоков, в котором при этом одновременно сможет выполняться не более чем заданное количество потоков.
Количество потоков задается как некоторое свойство.
Язык
Для объявления действия, выполняющего другое действие в новом потоке, используется оператор NEWTHREAD
. Для выполнения действия в новом пуле потоков используется оператор NEWEXECUTOR
.
Примеры
testNewThread () {
//Показ всем сообщения 'Сообщение'
FOR user(Connection conn) AND connectionStatus(conn) == ConnectionStatus.connectedConnection AND conn != currentConnection() DO {
NEWTHREAD MESSAGE 'Сообщение'; CONNECTION conn;
}
//Выполнение действия action с периодичностью в 10 секунд и задержкой 5 секунд
NEWTHREAD MESSAGE 'Hello World'; SCHEDULE PERIOD 10000 DELAY 5000;
}
testExecutor {
NEWEXECUTOR {
FOR id(Sku s) DO {
NEWTHREAD {
NEWSESSION {
name(s) <- STRING[20](id(s)); // записываем в наименование код в 10 потоков
APPLY;
}
}
}
} THREADS 10;
}