Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用终止条件关闭Java线程_Java_Multithreading_Concurrency - Fatal编程技术网

使用终止条件关闭Java线程

使用终止条件关闭Java线程,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个线程正在运行,调用外部web服务来检索一些数据。但是,当数据库中满足特定条件时,线程应该退出run方法(计算特定类型的行数,看看它们是否等于一个值)。我正在考虑实施这一计划,并考虑了以下方法 处理线程: run() { while(not [db call to get row count] = expected number ) { call web service // wait for

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

  • 处理线程:

        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);   
                }
        }    
    
  • 让外部线程监视数据库状态并更新AtomicBoolean变量。处理线程每次都会在while循环中检查此变量

    处理线程:

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

    @Override 
    public void run() {
       while (db.getNumLinesOfWantedType() >= wantedNum) {
          webServiceFillDB();
       }
       // The thread terminates here when the database has enough lines.
    }
    
    我没有在条件中添加
    =
    ,而是添加了
    =
    ,因为可能会得到比您想要的更多的行

    即使其他进程或线程同时填充数据库,此代码也是有效的。如果没有其他进程填充数据库,则可以使用for循环多次调用web服务,而无需在每个步骤检查数据库


    请注意,数据库从某种程度上说是“同步的”:当您检查数据库中的行数时,您会得到当前图片。

    对web服务的每次调用是否会在数据库中产生固定数量的新行?您是否正在生成已知数量的这些线程?每次web服务调用都会导致在db中创建一些行,但每次的数量都会有所不同。这是一个单线程,只是为了在下一次调用之前有点延迟?但不确定这是否是一种方法。因为您正在调用web服务,所以无论如何都会有一些延迟。没有理由再增加延迟。是否有其他线程或进程同时填充数据库?