使用终止条件关闭Java线程

时间:2011-08-16 16:25:35

标签: java multithreading concurrency

我有一个线程在运行,调用外部Web服务来检索一些数据。但是,当数据库中满足某个条件时,线程应该退出run方法(计算某种类型的行数并查看它们是否等于某个值)。我正在考虑实现这一点,并考虑了以下几种方式。

  1. 处理线程:

        run() {
    
                while(not [db call to get row count] = expected number ) {
    
                   call web service
    
                   // wait for some time for the next call? not sure
                   // if this is the way to do it
                   Thread.sleep(200);   
                }
        }    
    
  2. 让外部线程监视数据库状态并更新AtomicBoolean变量。处理线程每次都会在while循环中检查此变量。

    ProcessingThread:

    private Runnable dbStatusThread;
    run() {
    
       while(dbStatusThread.booleanValue == false) {
          call web service
    
              // wait for some time for the next call
          Thread.sleep(200);    
       }
    }
    
  3. 我尝试实现第二个选项,但即使布尔值设置为true,也不会总是反映出来并且run()并不总是立即退出。我在写这篇文章的时候正在阅读JCIP,但有没有人知道做这种事情的标准方法呢?感谢。

1 个答案:

答案 0 :(得分:0)

@Override 
public void run() {
   while (db.getNumLinesOfWantedType() >= wantedNum) {
      webServiceFillDB();
   }
   // The thread terminates here when the database has enough lines.
}

我没有在条件中添加==而是>=,因为您可能会获得比您想要的更多的行。

即使某个其他进程或线程在此代码有效的同时填充数据库。如果没有其他进程填充数据库,您可以让for循环调用Web服务一定次数,而不必在每一步都检查数据库。

请注意,数据库有一种“同步”开头:当您检查数据库中的行数时,您将获得当前图片。