实现思路,创建一个全局线程,开始就启动并且休眠,等待通知,
实在两个List集合,一个设置为空对象的集合,生产和消费的时候加锁和释放
1、全局线程
开始就启动
①
if (myFaceThread == null) {//启动线程
myFaceThread = new MyFaceThread();
myFaceThread.start();
}
②
class MyFaceThread extends Thread {
@Override
public void run() {
super.run();
Log.i("fenxi", "准备上传");
while (true) {
synchronized (mReadyList) {
try {
Log.i("fenxi", "获得锁");
mReadyList.wait(); //获得锁,等待通知
} catch (Exception e) {
e.printStackTrace();
Log.i("fenxi", "Exception");
}
while (true) {
FaceBuff tmp = null;
if (mReadyList.size() > 0) {
mwLock.writeLock().lock();
tmp = mReadyList.remove(0);//准备
mwLock.writeLock().unlock();
if (tmp != null) {
//上传操作
//upload success
//start send porotobuf
//send
}
} else {
Log.i("fenxi", "break");
break;
}
}
}
}
}
}
③、准备:
private ReadWriteLock mrwLock = new ReentrantReadWriteLock();//锁
private ReadWriteLock mwLock = new ReentrantReadWriteLock();//锁
private List<Bean> mReadyList = new ArrayList<>();//准备好使用消费
private List<Bean> mFreeList = new ArrayList<>();//空闲的
private void setmFreeList() {
for (int i = 0; i < 5; i++) {
Baen bean= new Baen ();
mFreeList.add(bean);
}
}
使用:
mrwLock.writeLock().lock();
if (mFreeList.size() > 0) {
Log.i("fenxi", "mFreeList.size==" + mFreeList.size());
temp = mFreeList.remove(0);
}
mrwLock.writeLock().unlock();
Log.i("fenxi", "mFreeList.size()==" + mFreeList.size());
if (null != temp) {
Log.i("fenxi", "null != temp");
temp.setFaceCountBaen(faceCountBaen);
temp.setFilename(fileName);//设置图片路径
mrwLock.writeLock().lock();
mReadyList.add(temp);
mrwLock.writeLock().unlock();
Log.i("fenxi", "mFreeList.size()==" + mFreeList.size());
}
//什么时候通知线程
if(){
synchronized (mReadyList) {
Log.i("fenxi", "释放锁");
mReadyList.notify();//通知发送
}
}