关键字:PriorityBlockingQueue
通过这种方法,我们就能把一个列表线程联系起来,并且让线程对列表的新增作出相应
前文:
Volley框架内用不少的while(true)死循环,java基础较差,不清楚其是如何等待执行和跳出的,下面将通过一个实例解析。
解析
1. 继承Thread类
```
public class VolleyTheoryWhileTrue extends Thread{
private final BlockingQueue<String> mBlockingQueue;
private boolean mQuit = false;
public VolleyTheoryWhileTrue(BlockingQueue<String> mBlockingQueue){
this.mBlockingQueue = mBlockingQueue;
}
...
}
```
这里是创建一个线程里,里面包还有阻塞queue,以用来存储将来要读取的数据
2. 在run()方法内创建这个死循环的目的是不断的从一个queue内取出子对象,然后对其一一做处理
run()方法如下
@Override
public void run() {
while (true){
try {
/**
* mBlockingQueue会在线程内声明如下
* private final BlockingQueue<String> mBlockingQueue;
* 线程初始化时会对mBlockingQueue赋值
* */
String string = mBlockingQueue.take();
Log.d("wuyazhouHttp","string: "+string);
} catch (InterruptedException e) {
if (mQuit) {
Log.d("wuyazhouHttp","线程结束");
return;
}
Log.d("wuyazhouHttp","string: 阻塞列表为空");
continue;
}
}
}
上段代码中就包含有是如何等待执行和结束的操作
- BlockingQueue是一个阻塞queue,在执行
mBlockingQueue.take()时会根据queue内是否还有数据来决定是否阻塞等待
3. 创建一个结束线程的方法quit().
public void quit() {
mQuit = true;
interrupt();
}
此方法主要是用来结束线程使用的,首先会更新标志位为可以结束线程,其次调用interrupt()方法中断阻塞并抛出一个异常,然后就能调用第二段代码中的return以终止进程
4. 测试用例
声明以及实例化 代码如下
private final PriorityBlockingQueue<String> mPriorityBlockingQueue = new PriorityBlockingQueue<String>();
private VolleyTheoryWhileTrue mThread = new VolleyTheoryWhileTrue(mPriorityBlockingQueue);
开始、添加、结束测试 代码如下
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start_thread:
if (!mThread.isAlive()){
mThread.start();
}
break;
case R.id.add_item:
mPriorityBlockingQueue.add("测试");
break;
case R.id.stop_thread:
mThread.quit();
break;
default:
break;
}
}
项目代码链接
https://github.com/wuyzh/HttpLearning
其中volleytheory模块为此处代码
Volley--网络通讯框架 目录










网友评论