当我尝试从头开始为 http 请求实现队列时遇到问题。抱歉,这对某人来说可能是一个非常幼稚的并发问题。
基本上我希望我的应用程序在任何时候都只执行一个请求。额外的请求进入队列并稍后执行。
我知道其他高级的东西,例如 FutureTask 和 Execution pool,但我想要答案,因为我很好奇如何解决基本的并发问题。以下是我的班级维护 requestQueue
private Queue<HttpRequest> requestQueue;
private AsyncTask myAsyncTask=null;
public boolean send(HttpRequest hr){
//if there isn't existing task, start a new one, otherwise just enqueue the request
//COMMENT 1.
if(myAsyncTask==null){
requestQueue.offer(hr);
myAsyncTask= new RequestTask();
myAsyncTask.execute(null);
return true;
}
else{
//enqueue
//COMMENT 2
requestQueue.offer(hr);
}
}
//nested class
RequestTask extends AsyncTask<boolean,void,void>{
protected HttpResponse doInBackground(void... v){
//send all request in the queue
while(requestQueue.peek != null){
HttpResquest r= requestQueue.poll
//... leave out code about executing the request
}
return true;
}
protected void doPostExecute(boolean success){
//COMMENT 3: if scheduler stop here just before myAsyncTask is set to null
myAsyncTask=null;
}
}
问题是,如果线程调度程序在 COMMENT 3 点停止后台线程(就在 myAsyncTask 设置为 null 之前)。
//COMMENT 3: if scheduler stop here just before myAsyncTask is set to null
myAsyncTask=null;
当时,其他线程碰巧到 COMMENT 1 点并进入 if ... else ... 块。因为 myAsyncTask 没有设置为 null,所以任务在 else 块中排队(注释 2),但不会创建新的 asyncTask,这意味着队列会卡住!
//COMMENT 1.
if(myAsyncTask==null){
requestQueue.offer(hr);
myAsyncTask= new RequestTask;
myAsyncTask.execute(null);
return true;
}
else{
//enqueue
//COMMENT 2
requestQueue.offer(hr);
}
我希望很清楚。队列有可能停止处理。我很想知道如何避免这种情况。先感谢您