实现一个简易的任务队列

1、实现一个简易任务队列,要求如下:

  • task()方法,执行一次任务,打印"task";
  • cancel()方法,取消上一次执行的任务,成功取消打印"cancel",如果未有任务可以取消,打印"notask";
  • sleep(ms:number),ms毫秒后再执行后面的任务,该任务本身可以被cancel;
    所有接口支持链式调用。
  • 取消的是前面的任务,前面有任务就cancel,没有任务就notask。
    比如:
    SimpleQueue queue = new SimpleQueue ();
    queue .cancel(); // 输出notask
    queue .task().cancel(); // 输出cancel
    queue .task().sleep(1).task().cancel(); // 输出task
public class SimpleQueue {
	// SingleThreadPool没有removed方法!
    private ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L,
            TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
    LinkedList<Runnable> list = new LinkedList<>(); //存放已经提交的任务

    SimpleQueue task(){
    
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("task");
            }
        };
        executor.execute(task);
        list.add(task);
        return this;
    }

    SimpleQueue cancel(){
        boolean remove = executor.remove(list.removeLast());
        if(remove){
            System.out.println("cancel");
        }else{
            System.out.println("notask");
        }
        return this;
    }

    SimpleQueue sleep(int num){
        Runnable task = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(num);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };
        executor.execute(task);
        list.add(task);
        return this;
    }

    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        SimpleQueue sq = new SimpleQueue();
        sq.task().sleep(5000).cancel().task();
    }
}

2、实现一个简单的令牌桶:ArrayBlockingQueue+Timer定时offer元素。