我有一个线程在运行,调用外部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循环中检查此变量。
ProcessingThread:
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,但有没有人知道做这种事情的标准方法呢?感谢。
答案 0 :(得分:0)
@Override
public void run() {
while (db.getNumLinesOfWantedType() >= wantedNum) {
webServiceFillDB();
}
// The thread terminates here when the database has enough lines.
}
我没有在条件中添加==
而是>=
,因为您可能会获得比您想要的更多的行。
即使某个其他进程或线程在此代码有效的同时填充数据库。如果没有其他进程填充数据库,您可以让for循环调用Web服务一定次数,而不必在每一步都检查数据库。
请注意,数据库有一种“同步”开头:当您检查数据库中的行数时,您将获得当前图片。