@Test
public void testPeek002() throws Exception {

    int capacity = 1;
    final long waittime = 1000;
    final DataValueObject obj1 = new DataValueObject("hoge");
    final CountDownLatch threadSync = new CountDownLatch(1);
    final ArrayBlockingQueueEx<DataValueObject> queue = new ArrayBlockingQueueEx<DataValueObject>(capacity);
    Thread thread01 = new Thread() {
        @Override
        public void run() {
            try {
                threadSync.await();
                sleep(waittime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            queue.add(obj1);
        }
    };
    // キューが空であることの確認
    assertEquals(0, queue.size());
    thread01.start();
    long timeStart = System.currentTimeMillis();
    threadSync.countDown();
    // 別スレッドでキューへ要素追加をしないとpeek()はいつまでも待ち続ける
    DataValueObject objPeek = queue.peek();
    long timeEnd = System.currentTimeMillis();
    long timeDiff = timeEnd - timeStart;
    // キューに要素が入るのを待ったことを確認
    // 約1000ミリ秒の待ち確認(50ミリ秒の誤差を許容)
    if (timeDiff < (waittime - 50)) {
        fail();
    }
    // キューの要素が追加されていることの確認
    assertEquals(obj1.getValue(), objPeek.getValue());
}