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

标签 java multithreading thread-safety

基本思想是我有一个 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/

相关文章:

java - 如何在 Google App Engine 中使用 StringTemplate 文件?

java - 如何等待所有线程(可变数量的线程)完成并继续 Main?

c++ - qt中的条件变量,在哪里声明

c++ - 函数体中静态定义的互斥量是否能够正确锁定?

AutoResetEvent 的 C# 线程问题

java - JButton 切换方法未按预期工作

java - 以下代码在 Eclipse 中工作,但是当我转换为 Maven 项目时,此代码给出错误

JavaFX 网络支持(TCP、UDP、SSH)?

c - 以循环方法调度 pthread

rust - 将调试数据转储到 Rust 中的静态文件的代码紧凑线程安全方法是什么?