@Test
public void testPut002() throws Exception {

    int capacity = 1;
    DataValueObject obj1 = new DataValueObject("hoge1");
    final CountDownLatch threadSync = new CountDownLatch(1);
    final ArrayBlockingQueueEx<DataValueObject> queue = new ArrayBlockingQueueEx<DataValueObject>(capacity);
    // キューをいっぱいにする
    queue.put(obj1);
    // 別スレッドでputを実行（キューがいっぱいなので待ちになる）
    ErrorFeedBackThread thread01 = new ErrorFeedBackThread() {
        @Override
        public void doRun() throws Exception {
            DataValueObject obj2 = new DataValueObject("hoge2");
            // 待ち状態をつくる
            long timeStart = System.currentTimeMillis();
            threadSync.countDown();
            try {
                queue.put(obj2);
                throw new RuntimeException("An exception did not occur within a definite period of time.");
            } catch (InterruptedException e) {
                // 期待通り
            }
            long timeEnd = System.currentTimeMillis();
            long timeDiff = timeEnd - timeStart;
            // 約1000ミリ秒の待ち確認(50ミリ秒の誤差を許容)
            if (timeDiff < 950) {
                throw new RuntimeException("An exception did not occur within a definite period of time.");
            }
        }
    };
    thread01.start();
    threadSync.await();
    TimeUnit.MILLISECONDS.sleep(1000);
    // 割り込み
    thread01.interrupt();
    thread01.throwErrorOrExceptionIfThrown();
}