我有一个函数parseData,它接收urls的向量并将它们交给DataParser。DataParser从urls获取数据并对其进行分析。问题是,用户可能会在以前的解析完成之前请求新的urls进行解析。在这种情况下,以前的数据变得无关紧要,但是线程继续工作。由于一个请求中可能有大量的urls,并且每个请求的解析都需要时间,在5-6个顺序请求电话启动之后,工作非常缓慢。
这是代码片段。
public void parseData(final String key, final Vector<String> data)
{
this.key = key;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
DataParser dp = new DataParser(key);
dp.setData(data);
dp.startParse();
}
});
thread.start();
}我认为解决方案可能是在DataParser中保留额外的标志。因为它在循环中请求urls,所以我可以检查标志和中断周期,但在我看来这似乎很粗鲁。
还有其他办法解决这个问题吗?
发布于 2014-04-12 12:58:42
您可以使用interrupt()方法:
thread.interrupt();顺便说一下,检查一些旗帜并不是那么粗鲁和糟糕的风格。但是,不要忘记声明这样的标志为volatile。
发布于 2014-04-12 12:59:26
您需要定期检查工作线程中的标志。如果要停止工作线程,请设置该标志。
发布于 2014-04-12 13:02:35
每次执行解析操作时,您都可以不断地检查布尔标志,如果此标志变为真,则停止解析。
从另一个线程中,您可以建立此标志的值以“取消”解析。
这是AsyncTasks用来取消在doInBackground()中完成的工作的技术。
class DataParser {
private boolean volatile mIsCancelled = false;
public void startParsingAsync() {
new Thread(new Runnable(
public void run() {
parse();
}
)).start();
}
private void parse() {
while(!isCancelled()) {
parseNextNode();
}
}
private synchronized void isCancelled() {
return mIsCancelled();
}
public synchronized void cancel() {
mIsCancelled = true;
}
private void parseNextNode() {
.....
}在另一个线程中,一旦数据变得不相关,就可以调用方法cancel()。
注意,您必须同步对标志的访问,因为它将从不同的线程中访问。
这段代码没有经过测试,所以它甚至可能不会编译.
这是理论,但对于实际用途,您应该使用AsyncTask,这给您取消。
https://stackoverflow.com/questions/23030602
复制相似问题