基本思想是我有一个本机函数,我想在后台线程中调用用户选择的值,并且线程在启动时不能被中断。如果用户决定在线程运行时更改用于执行任务的值(他们可以从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实用程序类?
答案 0 :(得分:0)
您可以按如下方式设计run()
方法:
public void run() {
int currentTaskValue;
do {
currentTaskValue = taskValue;
// perform the work...
} while (currentTaskValue != taskValue);
}
我认为volatile
上的taskValue
声明就足够了,因为不超过32位的原语的读写都是原子的。
答案 1 :(得分:0)
您是否考虑过ThreadPoolExecutor?它似乎非常适合您的问题,因为您提到您无需重新启动或停止已经启动的线程。
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html
用户可以向任务队列提交任意数量的任务,任务将由您在ThreadPoolExecutor构造函数中定义的一些工作线程同时处理。