concurrentlinkeddeque
时间: 2023-04-27 22:03:16 浏览: 68
ConcurrentLinkedDeque是Java中的一个线程安全的双向链表,它可以在多线程环境下进行并发操作。它支持在队列的两端进行插入和删除操作,并且可以在队列的任意位置进行元素的访问和修改。由于它是线程安全的,所以多个线程可以同时对它进行操作,而不会出现数据不一致的问题。同时,它也提供了一些高效的方法,如addFirst、addLast、pollFirst、pollLast等,可以方便地进行队列的操作。
相关问题
ConcurrentLinkedDeque的使用
ConcurrentLinkedDeque是Java中的一个线程安全的双端队列实现,可以在高并发环境下使用。以下是一个简单的ConcurrentLinkedDeque使用示例:
```java
import java.util.concurrent.ConcurrentLinkedDeque;
public class ConcurrentLinkedDequeExample {
public static void main(String[] args) {
// 创建一个ConcurrentLinkedDeque对象
ConcurrentLinkedDeque<String> deque = new ConcurrentLinkedDeque<String>();
// 添加元素
deque.addFirst("Apple");
deque.addLast("Banana");
deque.addLast("Orange");
// 获取元素
System.out.println("第一个元素是:" + deque.peekFirst());
System.out.println("最后一个元素是:" + deque.peekLast());
// 迭代元素
for (String fruit : deque) {
System.out.println(fruit);
}
// 删除元素
deque.removeFirst();
System.out.println("删除第一个元素后的队列:");
for (String fruit : deque) {
System.out.println(fruit);
}
}
}
```
输出结果如下:
```
第一个元素是:Apple
最后一个元素是:Orange
Apple
Banana
Orange
删除第一个元素后的队列:
Banana
Orange
```
在上面的示例中,我们创建了一个ConcurrentLinkedDeque对象并添加了几个元素。我们可以使用peekFirst和peekLast方法获取元素,使用for-each循环迭代元素,并使用removeFirst方法删除元素。由于ConcurrentLinkedDeque是线程安全的,因此可以安全地从多个线程访问。
private void drawBitmap() { try { mCanvas = null; //Log.d("MyView","判断bt是否为空"); ConcurrentLinkedDeque<Bitmap> drawDeque = cameraService.bitmapDeque; Log.d("调试draw", "drawDeque.size()=" + drawDeque.size()); Bitmap draw_bitmap=drawDeque.poll(); if (draw_bitmap != null) { // synchronized (MyBitmap.class) { //获得canvas对象 获取可以进行绘图的画布 mCanvas = mSurfaceHolder.lockCanvas(); //来锁定画布 //绘制背景 mCanvas.drawColor(Color.BLACK); //位图对象slip 在坐标 (1220, 0) 处绘制。 mCanvas.drawBitmap(slip, 1220, 0, paint); mCanvas.drawBitmap(draw_bitmap, 0, 0, paint); mCanvas.drawBitmap(windowService.getKiwibird(),0,0,paint); mCanvas.drawBitmap(windowService.getattent(),1040,150,paint); Log.d("调试", "画图一次"); //MyBitmap.bt = null; //释放位图资源 } //} //绘图 } catch (Exception e) { } finally { if (mCanvas != null) { //释放画布,并提交绘图操作。 mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } 为什么这里获取不了cameraService.bitmapDeque;使得drawDeque.size()一直为0
在这段代码中,获取不到`cameraService.bitmapDeque`的原因可能有几个可能情况:
1. `cameraService.bitmapDeque`为空:在调用`drawBitmap()`方法之前,确保`cameraService.bitmapDeque`已经被正确初始化。可以通过调试或添加日志输出来确认。
2. `cameraService.bitmapDeque`在其他地方被修改或清空:确保在调用`drawBitmap()`方法时,`cameraService.bitmapDeque`没有被其他线程修改或清空。可以在访问和修改`cameraService.bitmapDeque`的地方添加适当的同步机制,例如使用`synchronized`关键字或其他线程安全的集合类。
3. `drawDeque.poll()`返回null:`drawDeque.poll()`方法从队列中获取并删除元素,如果队列为空,则返回null。确保在调用`drawDeque.poll()`之前,队列中有元素。可以通过添加日志输出来检查队列中是否有元素。
通过仔细检查这些可能的情况,应该能够找到导致`drawDeque.size()`始终为0的原因,并解决问题。