可以根据条件重新启动的线程

时间:2011-03-31 19:22:19

标签: java multithreading thread-safety

基本思想是我有一个本机函数,我想在后台线程中调用用户选择的值,并且线程在启动时不能被中断。如果用户决定在线程运行时更改用于执行任务的值(他们可以从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实用程序类?

2 个答案:

答案 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构造函数中定义的一些工作线程同时处理。