SynchronousQueue队列的使用

一直知道java.util.concurrent.Executors#newCachedThreadPool()方法里面使用了SynchronousQueue队列,但是自己在项目中却找不到使用该队列的场景,今天看到,于是意淫出一个使用场景:有一个线程数为1的线程池,每次只能并发执行一个任务,当同时有多个任务被提交到该线程池时,抛弃多余的任务,代码如下:

import java.util.concurrent.*;

public class SyncQueueTester {
          
   

    private static ExecutorService executor = new ThreadPoolExecutor(1, 1,
            1000, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(),
            new ThreadPoolExecutor.DiscardPolicy());

    private static void kickOffEntry(final int index) {
        executor.submit(
                new Callable<Void>() {
                    public Void call() throws InterruptedException {
                        System.out.println("start " + index);
                        Thread.sleep(999); // pretend to do work
                        System.out.println("stop " + index);
                        return null;
                    }
                }
        );
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 20; i++) {
            kickOffEntry(i);
            Thread.sleep(200);
        }
        executor.shutdown();
    }
}

代码中使用了SynchronousQueue,其中DiscardPolicy表示抛弃后续来不及执行的任务。输出结果如下:

start 0
stop 0
start 5
stop 5
start 10
stop 10
start 15
stop 15
经验分享 程序员 微信小程序 职场和发展