开发者

Thread that can restart based on a condition

开发者 https://www.devze.com 2023-02-21 19:43 出处:网络
The basic idea is that I have a native function I want to call in a background thread with a user selected value and the thread cannot be interrupted when started. If the user decides to change the va

The basic idea is that I have a native function I want to call in a background thread with a user selected value and the thread cannot be interrupted when started. If the user decides to change the value used to perform the task while the thread is running (they can do this from a GUI), the thread should finish its task with the previous value and then restart with the new value. When the task is done and the value hasn't changed, the thread should end and call a callback function.

This is what my current code looks like f开发者_运维问答or the thread starting part:

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
     }
   }
}

And the actual work thread looks like this:

while (true)
{
    nativeFunctionCall(taskValue);

    synchronized (threadShouldRestart)
    { 
       if (!threadShouldRestart)
       {
         invokeTaskCompletedCallbackFunction();
         return;
       }
    }
}

I'm locking on the "threadShouldRestart" part because e.g. I don't want this changing to true just as the thread decides it's done which means the thread wouldn't restart when it was meant to.

Are there any cleaner ways to do this or Java utility classes I could be using?


You could design your run() method as follows:

public void run() {
    int currentTaskValue;
    do {
        currentTaskValue = taskValue;
        // perform the work...
    } while (currentTaskValue != taskValue);
}

I think the volatile declaration on taskValue is enough for this, since reads and writes of primitives no larger than 32 bits are atomic.


Have you considered a ThreadPoolExecutor? It seems to lend itself well to your problem as you mentioned you have no need to restart or stop a thread which has already started.

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

A user could submit as many tasks as they like to a task queue, tasks will be processed concurrently by some number of worker threads you define in the ThreadPoolExecutor constructor.

0

精彩评论

暂无评论...
验证码 换一张
取 消