Volley(四)--while(true)死循环是如何等待执行和跳出的

关键字:PriorityBlockingQueue

通过这种方法,我们就能把一个列表线程联系起来,并且让线程对列表的新增作出相应

前文:

Volley框架内用不少的while(true)死循环,java基础较差,不清楚其是如何等待执行和跳出的,下面将通过一个实例解析。

解析

1. 继承Thread

```
public class VolleyTheoryWhileTrue extends Thread{
    private final BlockingQueue mBlockingQueue;
    private boolean mQuit = false;

    public VolleyTheoryWhileTrue(BlockingQueue mBlockingQueue){
        this.mBlockingQueue = mBlockingQueue;
    }
    ...
}
```

这里是创建一个线程里,里面包还有阻塞queue,以用来存储将来要读取的数据

2. 在run()方法内创建这个死循环的目的是不断的从一个queue内取出子对象,然后对其一一做处理

run()方法如下

@Override
    public void run() {
        while (true){
            try {
                /**
                 * mBlockingQueue会在线程内声明如下
                 * private final BlockingQueue 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 mPriorityBlockingQueue = new PriorityBlockingQueue();
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--网络通讯框架 目录

你可能感兴趣的:(Volley(四)--while(true)死循环是如何等待执行和跳出的)