生命周期
每个通过 launch 或 async 启动的协程都由一个 Job 对象表示,它不仅是协程的句柄,也是其生命周期状态的体现。
Job 的状态查询
Job 对象提供了多个方法来查询协程的当前状态。
isActive: true 表示协程正在运行或可以运行。
isCompleted: true 表示协程已结束(无论成功、失败还是被取消)。
isCancelled: true 表示协程已被取消或因失败而正在取消中。
import com.m8test.script.GlobalVariables.*
/*
* 完整示例 6.1: 查询一个 Job 的生命周期状态
*/
// --- 样板代码 ---
_threads.getMain().setBackground(true)
val scope = _coroutines.newScope(null)
// 启动一个会运行一段时间的协程
// 修复:移除 lambda 参数 s ->,直接调用 delay
val job = scope.launch(null, null) { delay(1000) }
_console.log("任务刚启动:")
_console.log(" - is active: " + job.isActive())
_console.log(" - is completed: " + job.isCompleted())
_console.log(" - is cancelled: " + job.isCancelled())
// 等待 500 毫秒,任务仍在运行中
scope.delay(500).then { s, _ ->
_console.log("\n任务运行 500 毫秒后:")
_console.log(" - is active: " + job.isActive())
_console.log(" - is completed: " + job.isCompleted())
_console.log(" - is cancelled: " + job.isCancelled())
job.toDeferred()
}.then { s, _ ->
_console.log("\n任务自然完成后:")
_console.log(" - is active: " + job.isActive()) // 变为 false
_console.log(" - is completed: " + job.isCompleted()) // 变为 true
_console.log(" - is cancelled: " + job.isCancelled()) // 保持 false
s.resolve(null)
}
/*
* 完整示例 6.1: 查询一个 Job 的生命周期状态
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true)
def scope = $coroutines.newScope(null)
// 启动一个会运行一段时间的协程
def job = scope.launch(null, null, { s -> s.delay(1000) })
$console.log("任务刚启动:")
$console.log(" - is active: " + job.isActive())
$console.log(" - is completed: " + job.isCompleted())
$console.log(" - is cancelled: " + job.isCancelled())
// 等待 500 毫秒,任务仍在运行中
scope.delay(500).then({ s, _ ->
$console.log("\n任务运行 500 毫秒后:")
$console.log(" - is active: " + job.isActive())
$console.log(" - is completed: " + job.isCompleted())
$console.log(" - is cancelled: " + job.isCancelled())
job.toDeferred()
}).then({ s, _ ->
$console.log("\n任务自然完成后:")
$console.log(" - is active: " + job.isActive()) // 变为 false
$console.log(" - is completed: " + job.isCompleted()) // 变为 true
$console.log(" - is cancelled: " + job.isCancelled()) // 保持 false
s.resolve(null)
})
/*
* 完整示例 6.1: 查询一个 Job 的生命周期状态
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true);
const scope = $coroutines.newScope(null);
// 启动一个会运行一段时间的协程
const job = scope.launch(null, null, s => s.delay(1000));
$console.log("任务刚启动:");
$console.log(" - is active: " + job.isActive());
$console.log(" - is completed: " + job.isCompleted());
$console.log(" - is cancelled: " + job.isCancelled());
// 等待 500 毫秒,任务仍在运行中
scope.delay(500).then((s, _) => {
$console.log("\n任务运行 500 毫秒后:");
$console.log(" - is active: " + job.isActive());
$console.log(" - is completed: " + job.isCompleted());
$console.log(" - is cancelled: " + job.isCancelled());
return job.toDeferred();
}).then((s, _) => {
$console.log("\n任务自然完成后:");
$console.log(" - is active: " + job.isActive()); // 变为 false
$console.log(" - is completed: " + job.isCompleted()); // 变为 true
$console.log(" - is cancelled: " + job.isCancelled()); // 保持 false
return s.resolve(null);
});
--[[
* 完整示例 6.1: 查询一个 Job 的生命周期状态
]]
-- --- 样板代码 ---
_threads:getMain():setBackground(true)
local scope = _coroutines:newScope(nil)
-- 启动一个会运行一段时间的协程
local job = scope:launch(nil, nil, function(s) return s:delay(1000) end)
_console:log("任务刚启动:")
_console:log(" - is active: " .. tostring(job:isActive()))
_console:log(" - is completed: " .. tostring(job:isCompleted()))
_console:log(" - is cancelled: " .. tostring(job:isCancelled()))
-- 等待 500 毫秒,任务仍在运行中
scope:delay(500):_then(function(s, _)
_console:log("\n任务运行 500 毫秒后:")
_console:log(" - is active: " .. tostring(job:isActive()))
_console:log(" - is completed: " .. tostring(job:isCompleted()))
_console:log(" - is cancelled: " .. tostring(job:isCancelled()))
return job:toDeferred()
end):_then(function(s, _)
_console:log("\n任务自然完成后:")
_console:log(" - is active: " .. tostring(job:isActive())) -- 变为 false
_console:log(" - is completed: " .. tostring(job:isCompleted())) -- 变为 true
_console:log(" - is cancelled: " .. tostring(job:isCancelled())) -- 保持 false
return s:resolve(nil)
end)
<?php
/** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */
global $threads;
/** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */
global $coroutines;
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
/*
* 完整示例 6.1: 查询一个 Job 的生命周期状态
*/
// --- 样板代码 ---
$threads->getMain()->setBackground(true);
$scope = $coroutines->newScope(function ($context) {
$context->setDispatcher(function ($dispatchers) {
return $dispatchers->getScriptMain();
});
});
// 启动一个会运行一段时间的协程
$job = $scope->launch(null, null, function ($s) {
return $s->delay(1000);
});
$console->log(javaString("任务刚启动:"));
$console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false'));
$console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false'));
$console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false'));
// 等待 500 毫秒,任务仍在运行中
$scope->delay(500)->then(function ($s, $_) use ($job) {
global $console;
$console->log(javaString("\n任务运行 500 毫秒后:"));
$console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false'));
$console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false'));
$console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false'));
return $job->toDeferred();
})->then(function ($s, $_) use ($job) {
global $console;
$console->log(javaString("\n任务自然完成后:"));
$console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false')); // 变为 false
$console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false')); // 变为 true
$console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false')); // 保持 false
return $s->resolve(null);
});
#
# 完整示例 6.1: 查询一个 Job 的生命周期状态
#
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _coroutines
# --- 样板代码 ---
# 导入所需的全局变量
from m8test_java.com.m8test.script.GlobalVariables import _threads
_threads.getMain().setBackground(True)
scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain()))
# 启动一个会运行一段时间的协程
job = scope.launch(None, None, lambda s: s.delay(1000))
_console.log("任务刚启动:")
_console.log(" - is active: " + str(job.isActive()))
_console.log(" - is completed: " + str(job.isCompleted()))
_console.log(" - is cancelled: " + str(job.isCancelled()))
# 等待 500 毫秒,任务仍在运行中
scope.delay(500).then(lambda s, _: (
_console.log("\n任务运行 500 毫秒后:"),
_console.log(" - is active: " + str(job.isActive())),
_console.log(" - is completed: " + str(job.isCompleted())),
_console.log(" - is cancelled: " + str(job.isCancelled())),
job.toDeferred()
)[-1]).then(lambda s, _: (
_console.log("\n任务自然完成后:"),
_console.log(" - is active: " + str(job.isActive())), # 变为 false
_console.log(" - is completed: " + str(job.isCompleted())), # 变为 true
_console.log(" - is cancelled: " + str(job.isCancelled())), # 保持 false
s.resolve(None)
)[-1])
# encoding: utf-8
#
# 完整示例 6.1: 查询一个 Job 的生命周期状态
#
# --- 样板代码 ---
$threads.getMain().setBackground(true)
scope = $coroutines.newScope(nil)
# 启动一个会运行一段时间的协程
job = scope.launch(nil, nil) { |s| s.delay(1000) }
$console.log("任务刚启动:")
$console.log(" - is active: " + job.isActive().to_s)
$console.log(" - is completed: " + job.isCompleted().to_s)
$console.log(" - is cancelled: " + job.isCancelled().to_s)
# 等待 500 毫秒,任务仍在运行中
scope.delay(500).then do |s, _|
$console.log("\n任务运行 500 毫秒后:")
$console.log(" - is active: " + job.isActive().to_s)
$console.log(" - is completed: " + job.isCompleted().to_s)
$console.log(" - is cancelled: " + job.isCancelled().to_s)
job.toDeferred()
end.then do |s, _|
$console.log("\n任务自然完成后:")
$console.log(" - is active: " + job.isActive().to_s) # 变为 false
$console.log(" - is completed: " + job.isCompleted().to_s) # 变为 true
$console.log(" - is cancelled: " + job.isCancelled().to_s) # 保持 false
s.resolve(nil)
end
取消协程或作用域
取消是结构化并发的核心。您可以取消单个 Job,也可以取消整个 CoroutineScope,后者会取消作用域内所有活动的协程。
import com.m8test.script.GlobalVariables.*
/*
* 完整示例 6.2: 取消一个长时间运行的 Job
*/
// --- 样板代码 ---
_threads.getMain().setBackground(true)
val scope = _coroutines.newScope(null)
// 修复:移除 lambda 参数 s ->
val longRunningJob = scope.launch(null, null) {
_console.log("一个需要5秒才能完成的漫长任务已启动...")
delay(5000).then { s1, _ ->
_console.log("任务完成, 这个任务被取消了,不应该执行")
s1.resolve(null)
}
}
// 在任务启动后,等待 2.5 秒然后取消它
scope.delay(2500).then { s, _ ->
_console.log(" - is active: " + longRunningJob.isActive())
_console.log(" - is completed: " + longRunningJob.isCompleted())
_console.log(" - is cancelled: " + longRunningJob.isCancelled())
_console.log("\n发送取消信号给任务!")
longRunningJob.cancel("用户请求超时。")
// 检查取消后的状态
_console.log("任务取消信号已发送:")
_console.log(" - is active: " + longRunningJob.isActive())
_console.log(" - is completed: " + longRunningJob.isCompleted()) // 可能还未完全完成
_console.log(" - is cancelled: " + longRunningJob.isCancelled()) // 变为 true
s.resolve(null)
}
/*
* 完整示例 6.2: 取消一个长时间运行的 Job
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true)
def scope = $coroutines.newScope(null)
def longRunningJob = scope.launch(null, null, { s ->
$console.log("一个需要5秒才能完成的漫长任务已启动...")
s.delay(5000).then { s1 ->
$console.log("任务完成, 这个任务被取消了,不应该执行")
s1.resolve(null)
}
})
// 在任务启动后,等待 2.5 秒然后取消它
scope.delay(2500).then({ s, _ ->
$console.log(" - is active: " + longRunningJob.isActive())
$console.log(" - is completed: " + longRunningJob.isCompleted())
$console.log(" - is cancelled: " + longRunningJob.isCancelled())
$console.log("\n发送取消信号给任务!")
longRunningJob.cancel("用户请求超时。")
// 检查取消后的状态
$console.log("任务取消信号已发送:")
$console.log(" - is active: " + longRunningJob.isActive())
$console.log(" - is completed: " + longRunningJob.isCompleted()) // 可能还未完全完成
$console.log(" - is cancelled: " + longRunningJob.isCancelled()) // 变为 true
s.resolve(null)
})
/*
* 完整示例 6.2: 取消一个长时间运行的 Job
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true);
const scope = $coroutines.newScope(null);
const longRunningJob = scope.launch(null, null, s => {
$console.log("一个需要5秒才能完成的漫长任务已启动...");
s.delay(5000).then(s1 => {
$console.log("任务完成, 这个任务被取消了,不应该执行");
return s1.resolve(null);
});
});
// 在任务启动后,等待 2.5 秒然后取消它
scope.delay(2500).then((s, _) => {
$console.log(" - is active: " + longRunningJob.isActive());
$console.log(" - is completed: " + longRunningJob.isCompleted());
$console.log(" - is cancelled: " + longRunningJob.isCancelled());
$console.log("\n发送取消信号给任务!");
longRunningJob.cancel("用户请求超时。");
// 检查取消后的状态
$console.log("任务取消信号已发送:");
$console.log(" - is active: " + longRunningJob.isActive());
$console.log(" - is completed: " + longRunningJob.isCompleted()); // 可能还未完全完成
$console.log(" - is cancelled: " + longRunningJob.isCancelled()); // 变为 true
return s.resolve(null);
});
--[[
* 完整示例 6.2: 取消一个长时间运行的 Job
]]
-- --- 样板代码 ---
_threads:getMain():setBackground(true)
local scope = _coroutines:newScope(nil)
local longRunningJob = scope:launch(nil, nil, function(s)
_console:log("一个需要5秒才能完成的漫长任务已启动...")
s:delay(5000):_then(function(s1)
_console:log("任务完成, 这个任务被取消了,不应该执行")
return s1:resolve(nil)
end)
end)
-- 在任务启动后,等待 2.5 秒然后取消它
scope:delay(2500):_then(function(s, _)
_console:log(" - is active: " .. tostring(longRunningJob:isActive()))
_console:log(" - is completed: " .. tostring(longRunningJob:isCompleted()))
_console:log(" - is cancelled: " .. tostring(longRunningJob:isCancelled()))
_console:log("\n发送取消信号给任务!")
longRunningJob:cancel("用户请求超时。")
-- 检查取消后的状态
_console:log("任务取消信号已发送:")
_console:log(" - is active: " .. tostring(longRunningJob:isActive()))
_console:log(" - is completed: " .. tostring(longRunningJob:isCompleted())) -- 可能还未完全完成
_console:log(" - is cancelled: " .. tostring(longRunningJob:isCancelled())) -- 变为 true
return s:resolve(nil)
end)
<?php
/** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */
global $threads;
/** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */
global $coroutines;
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
/*
* 完整示例 6.2: 取消一个长时间运行的 Job
*/
// --- 样板代码 ---
$threads->getMain()->setBackground(true);
$scope = $coroutines->newScope(function ($context) {
$context->setDispatcher(function ($dispatchers) {
return $dispatchers->getScriptMain();
});
});
$longRunningJob = $scope->launch(null, null, function ($s) {
global $console;
$console->log(javaString("一个需要5秒才能完成的漫长任务已启动..."));
$s->delay(5000)->then(function ($s1) {
global $console;
$console->log(javaString("任务完成, 这个任务被取消了,不应该执行"));
return $s1->resolve(null);
});
});
// 在任务启动后,等待 2.5 秒然后取消它
$scope->delay(2500)->then(function ($s, $_) use ($longRunningJob) {
global $console;
$console->log(javaString(" - is active: ") . ($longRunningJob->isActive() ? 'true' : 'false'));
$console->log(javaString(" - is completed: ") . ($longRunningJob->isCompleted() ? 'true' : 'false'));
$console->log(javaString(" - is cancelled: ") . ($longRunningJob->isCancelled() ? 'true' : 'false'));
$console->log(javaString("\n发送取消信号给任务!"));
$longRunningJob->cancel(javaString("用户请求超时。"));
// 检查取消后的状态
$console->log(javaString("任务取消信号已发送:"));
$console->log(javaString(" - is active: ") . ($longRunningJob->isActive() ? 'true' : 'false'));
$console->log(javaString(" - is completed: ") . ($longRunningJob->isCompleted() ? 'true' : 'false')); // 可能还未完全完成
$console->log(javaString(" - is cancelled: ") . ($longRunningJob->isCancelled() ? 'true' : 'false')); // 变为 true
return $s->resolve(null);
});
#
# 完整示例 6.2: 取消一个长时间运行的 Job
#
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _coroutines
# --- 样板代码 ---
# 导入所需的全局变量
from m8test_java.com.m8test.script.GlobalVariables import _threads
_threads.getMain().setBackground(True)
scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain()))
longRunningJob = scope.launch(None, None, lambda s: (
_console.log("一个需要5秒才能完成的漫长任务已启动..."),
s.delay(5000).then(lambda s1: (
_console.log("任务完成, 这个任务被取消了,不应该执行"),
s1.resolve(None)
)[-1])
))
# 在任务启动后,等待 2.5 秒然后取消它
scope.delay(2500).then(lambda s, _: (
_console.log(" - is active: " + str(longRunningJob.isActive())),
_console.log(" - is completed: " + str(longRunningJob.isCompleted())),
_console.log(" - is cancelled: " + str(longRunningJob.isCancelled())),
_console.log("\n发送取消信号给任务!"),
longRunningJob.cancel("用户请求超时。"),
# 检查取消后的状态
_console.log("任务取消信号已发送:"),
_console.log(" - is active: " + str(longRunningJob.isActive())),
_console.log(" - is completed: " + str(longRunningJob.isCompleted())), # 可能还未完全完成
_console.log(" - is cancelled: " + str(longRunningJob.isCancelled())), # 变为 true
s.resolve(None)
)[-1])
# encoding: utf-8
#
# 完整示例 6.2: 取消一个长时间运行的 Job
#
# --- 样板代码 ---
$threads.getMain().setBackground(true)
scope = $coroutines.newScope(nil)
longRunningJob = scope.launch(nil, nil) do |s|
$console.log("一个需要5秒才能完成的漫长任务已启动...")
s.delay(5000).then do |s1|
$console.log("任务完成, 这个任务被取消了,不应该执行")
s1.resolve(nil)
end
end
# 在任务启动后,等待 2.5 秒然后取消它
scope.delay(2500).then do |s, _|
$console.log(" - is active: " + longRunningJob.isActive().to_s)
$console.log(" - is completed: " + longRunningJob.isCompleted().to_s)
$console.log(" - is cancelled: " + longRunningJob.isCancelled().to_s)
$console.log("\n发送取消信号给任务!")
longRunningJob.cancel("用户请求超时。")
# 检查取消后的状态
$console.log("任务取消信号已发送:")
$console.log(" - is active: " + longRunningJob.isActive().to_s)
$console.log(" - is completed: " + longRunningJob.isCompleted().to_s) # 可能还未完全完成
$console.log(" - is cancelled: " + longRunningJob.isCancelled().to_s) # 变为 true
s.resolve(nil)
end
job.invokeOnCompletion: 注册完成回调
.onComplete() 是 Deferred 的便利方法,但更底层的 job.invokeOnCompletion 提供了更原始的能力:它会接收一个可空的 Throwable 参数,让你能精确地知道任务是如何结束的。
import com.m8test.script.GlobalVariables.*
/*
* 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
*/
// --- 样板代码 ---
_threads.getMain().setBackground(true)
val scope = _coroutines.newScope(null)
val job = scope.delay(500).then { innerScope, _ ->
if (Math.random() > 0.5) {
innerScope.resolve("操作成功")
} else {
val err = _exceptions.newThrowable { setMessageAndClassName("模拟一个随机错误", null) }
innerScope.reject(err)
}
}
// 注册一个完成回调
job.invokeOnCompletion { error ->
if (error == null) {
_console.log("invokeOnCompletion: 任务成功完成!")
} else {
_console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage())
}
}
/*
* 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true)
def scope = $coroutines.newScope(null)
def job = scope.delay(500).then({ innerScope, _ ->
if (Math.random() > 0.5) {
innerScope.resolve("操作成功")
} else {
def err = $exceptions.newThrowable({ it.setMessageAndClassName("模拟一个随机错误", null) })
innerScope.reject(err)
}
})
// 注册一个完成回调
job.invokeOnCompletion({ error ->
if (error == null) {
$console.log("invokeOnCompletion: 任务成功完成!")
} else {
$console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage())
}
})
/*
* 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
*/
// --- 样板代码 ---
$threads.getMain().setBackground(true);
const scope = $coroutines.newScope(null);
const job = scope.delay(500).then((innerScope, _) => {
if (Math.random() > 0.5) {
return innerScope.resolve("操作成功");
} else {
const err = $exceptions.newThrowable(it => it.setMessageAndClassName("模拟一个随机错误", null));
return innerScope.reject(err);
}
});
// 注册一个完成回调
job.invokeOnCompletion(error => {
if (error == null) {
$console.log("invokeOnCompletion: 任务成功完成!");
} else {
$console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage());
}
});
--[[
* 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
]]
-- --- 样板代码 ---
_threads:getMain():setBackground(true)
local scope = _coroutines:newScope(nil)
local job = scope:delay(500):_then(function(innerScope, _)
if math.random() > 0.5 then
return innerScope:resolve("操作成功")
else
local err = _exceptions:newThrowable(function(it) it:setMessageAndClassName("模拟一个随机错误", nil) end)
return innerScope:reject(err)
end
end)
-- 注册一个完成回调
job:invokeOnCompletion(function(error)
if error == nil then
_console:log("invokeOnCompletion: 任务成功完成!")
else
_console:error("invokeOnCompletion: 任务因异常而完成 -> " .. error:getMessage())
end
end)
<?php
/** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */
global $threads;
/** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */
global $coroutines;
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
/** @var m8test_java\com\m8test\script\core\api\exception\Exceptions $exceptions */
global $exceptions;
/*
* 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
*/
// --- 样板代码 ---
$threads->getMain()->setBackground(true);
$scope = $coroutines->newScope(function ($context) {
$context->setDispatcher(function ($dispatchers) {
return $dispatchers->getScriptMain();
});
});
$job = $scope->delay(500)->then(function ($innerScope, $_) {
global $exceptions;
if ((mt_rand() / mt_getrandmax()) > 0.5) {
return $innerScope->resolve(javaString("操作成功"));
} else {
$err = $exceptions->newThrowable(function ($it) {
$it->setMessageAndClassName(javaString("模拟一个随机错误"), null);
});
return $innerScope->reject($err);
}
});
// 注册一个完成回调
$job->invokeOnCompletion(function ($error) {
global $console;
if ($error == null) {
$console->log(javaString("invokeOnCompletion: 任务成功完成!"));
} else {
$console->error(javaString("invokeOnCompletion: 任务因异常而完成 -> ") . $error->getMessage());
}
});
# 导入Python标准库
import random
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _coroutines
from m8test_java.com.m8test.script.GlobalVariables import _exceptions
# --- 样板代码 ---
# 导入所需的全局变量
from m8test_java.com.m8test.script.GlobalVariables import _threads
#
# 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
#
_threads.getMain().setBackground(True)
scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain()))
job = scope.delay(500).then(lambda innerScope, _:
innerScope.resolve("操作成功") if random.random() > 0.5 else
innerScope.reject(_exceptions.newThrowable(
lambda it: it.setMessageAndClassName("模拟一个随机错误", None)))
)
# 注册一个完成回调
job.invokeOnCompletion(lambda error: (
_console.log("invokeOnCompletion: 任务成功完成!") if error is None else
_console.error("invokeOnCompletion: 任务因异常而完成 -> " + str(error.getMessage()))
))
# encoding: utf-8
#
# 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态
#
# --- 样板代码 ---
$threads.getMain().setBackground(true)
scope = $coroutines.newScope(nil)
job = scope.delay(500).then do |innerScope, _|
if Java::JavaLang::Math.random() > 0.5
innerScope.resolve("操作成功")
else
err = $exceptions.newThrowable { |it| it.setMessageAndClassName("模拟一个随机错误", nil) }
innerScope.reject(err)
end
end
# 注册一个完成回调
job.invokeOnCompletion do |error|
if error == nil
$console.log("invokeOnCompletion: 任务成功完成!")
else
$console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage())
end
end
09 December 2025