import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class LBDLockPatternTest { final int CAP = 10000; final LinkedBlockingDeque<Integer> m_lbd = new LinkedBlockingDeque<Integer>(CAP); final ExecutorService m_executor; int m_counter; volatile int m_watch = 0; class Poller implements Runnable { public void run() { m_lbd.poll(); } } class Offerer extends Thread { public void run() { while (true) { for (int i=0; i < CAP/4; ++i) m_lbd.offer(0); System.out.printf("."); if (m_lbd.size() > CAP / 2) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } } } } public LBDLockPatternTest() { m_executor = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(CAP)); ((ThreadPoolExecutor)m_executor).setRejectedExecutionHandler( new ThreadPoolExecutor.DiscardPolicy()); } public void runTest() { new Offerer().start(); while (true) { m_executor.execute(new Poller()); } } public static void main(String[] args) { LBDLockPatternTest that = new LBDLockPatternTest(); that.runTest(); } }