public void start() {
        Preconditions.checkState(state.compareAndSet(State.LATENT, State.STARTED), "Cannot be started more than once");

        Preconditions.checkState(!executorService.isShutdown(), "Already started");
        Preconditions.checkState(!hasLeadership, "Already has leadership");

        client.getConnectionStateListenable().addListener(listener);
        requeue();
    }
@Test
    public void testInterruption() throws Exception {
        Timing2 timing = new Timing2();
        LeaderSelector selector = null;
        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
        try {
            client.start();

            CountDownLatch exitLatch = new CountDownLatch(1);
            BlockingQueue<Thread> threadExchange = new ArrayBlockingQueue<>(1);
            LeaderSelectorListener listener = new LeaderSelectorListenerAdapter() {
                @Override
                public void takeLeadership(CuratorFramework client) throws Exception {
                    threadExchange.put(Thread.currentThread());
                    try {
                        Thread.currentThread().join();
                    } finally {
                        exitLatch.countDown();
                    }
                }
            };
            selector = new LeaderSelector(client, PATH_NAME, listener);
            selector.failedMutexReleaseCount = new AtomicInteger();
            selector.start();
            Thread leaderThread = timing.takeFromQueue(threadExchange);
            leaderThread.interrupt();
            assertTrue(timing.awaitLatch(exitLatch));
            timing.sleepABit(); // wait for leader selector to clear nodes
            assertEquals(0, selector.failedMutexReleaseCount.get());
        } finally {
            CloseableUtils.closeQuietly(selector);
            CloseableUtils.closeQuietly(client);
        }
    }