我正在开发一个Android应用程序,它使用JavaCameraView类打开视频流,并从中捕获帧。然后,我的目标是实现将这些帧保存到缓冲区的工作线程,以及从缓冲区获取每一帧的另一个线程,以便使用图像处理技术处理它。 因此缓冲区是这两个工作线程之间共享的资源,应该同时运行,因此同时填充和清空缓冲区。 我想将缓冲区实现为ConcurrentLinkedQueue,并实现了两个线程实现Runnable接口。然后,在主活动中,我声明它们,我将它们变为现实,然后我启动它们,但似乎只有第一个运行,第二个永远不会启动。 我在这里发布我的代码:
1)Buffer.java
public class Buffer {
private ConcurrentLinkedQueue<Mat> MyBuffer = new ConcurrentLinkedQueue<Mat>();
private static final String TAG = "MyBufferClass :: ";
private int index = 1;
public Buffer(){
Log.d(TAG,"Buffer Created");
}
public void insertElementInTail(Mat element){
MyBuffer.offer(element);
}
public Mat retrieveElementInHead(){
synchronized (MyBuffer){
if(!MyBuffer.isEmpty()){
return MyBuffer.peek();
}else{
return null;
}
}
}
public Mat removeElementInHead(){
synchronized (MyBuffer){
if(!MyBuffer.isEmpty()){
return MyBuffer.poll();
}else{
return null;
}
}
}
public int getSize(){
return MyBuffer.size();
}
}
2)SaveInBuffer.java
public class SaveInBuffer implements Runnable {
private Handler myHandler;
private Buffer myBuffer;
public Handler myThreadHandler;
MainActivity mainActivity;
Handler mainHandler;
int what = -1;
public SaveInBuffer(Buffer myBuf, MainActivity mainActivity){
//super("SaveInBuffer");
this.myBuffer = myBuf;
this.mainActivity = mainActivity;
this.mainHandler = mainActivity.mainHandler;
}
@Override
public void run(){
Looper.prepare();
myThreadHandler = new Handler(){
public void handleMessage( Message msg ){
if(msg.what==4){
Mat returnedFrame = (Mat)msg.obj;
myBuffer.insertElementInTail(returnedFrame);
}
}
};
Looper.loop();
}
}
3)TakeFromBuffer.java
public class TakeFromBuffer implements Runnable{
public Handler consumerHandler;
private Buffer myBuffer;
public TakeFromBuffer(Buffer myBuffer){
this.myBuffer = myBuffer;
}
@Override
public void run(){
Looper.prepare();
Mat consumedFrame = myBuffer.removeElementInHead();
Looper.loop();
}
}
缓冲区在MainActivity中创建,然后作为参数传递给线程。问题是如何将Buffer作为共享资源进行管理,从而实现同步技术,以及如何同时启动两个线程,因为它们同时运行非常重要。
我该怎么办? 任何帮助都将非常感激。