基本思想是我有一个 native 函数,我想在后台线程中调用用户选择的值,并且线程启动时不能被中断。如果用户决定在线程运行时更改用于执行任务的值(他们可以从 GUI 执行此操作),则线程应使用先前的值完成其任务,然后使用新值重新启动。当任务完成并且值没有改变时,线程应该结束并调用回调函数。
这就是我当前的线程启动部分代码:
volatile int taskValue;
volatile boolean taskShouldRestart;
void setTaskValue(int value)
{
taskValue = value;
synchronized (threadShouldRestart)
{
if task thread is already running
threadShouldRestart = true
else
{
threadShouldRestart = false
create and start new thread
}
}
}
实际的工作线程如下所示:
while (true)
{
nativeFunctionCall(taskValue);
synchronized (threadShouldRestart)
{
if (!threadShouldRestart)
{
invokeTaskCompletedCallbackFunction();
return;
}
}
}
我锁定“threadShouldRestart”部分,因为例如我不希望在线程决定完成时将其更改为 true,这意味着线程不会在预定时重新启动。
是否有更简洁的方法来执行此操作或我可以使用 Java 实用程序类?
最佳答案
您可以按如下方式设计 run()
方法:
public void run() {
int currentTaskValue;
do {
currentTaskValue = taskValue;
// perform the work...
} while (currentTaskValue != taskValue);
}
我认为 taskValue
上的 volatile
声明足以满足此目的,因为不大于 32 位的原语的读取和写入是原子的。
关于java - 可以根据条件重新启动的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505134/