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元素。