Java线程实现延迟队列代码实现
实践方法1:
private void autoCloseStream(Integer roomId, Integer previewTime) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Runnable() {
@Override
public void run() {
BlockingQueue<Task> delayer = new DelayQueue<>();
long now = System.currentTimeMillis();
//任务入队
delayer.offer(new Task(now + previewTime * 1000));
while (delayer.size() != 0) {
//任务出队
if (delayer.poll() != null) {
BaseSiteModel<Integer> baseSiteModel = new BaseSiteModel(roomId);
baseSiteModel.setSiteId(CommonContext.get().getSiteId());
String channelName = ServiceSiteTool.appLiveChatService().generateChannelName(baseSiteModel);
MediaTool.settingRule(channelName, roomId, CommonContext.get().getUserId(), KickingRuleTypeEnum.JOIN_CHANNEL.getCode());
}
}
}
});
}
static class Task implements Delayed {
long time = System.currentTimeMillis();
public Task(long time) {
this.time = time;
}
@Override
public int compareTo(Delayed o) {
if (this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))
return -1;
else if (this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))
return 1;
else
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(time - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public String toString() {
return "" + time;
}
}
实践方法2:
public void test1(){
LOG.info("准备执行任务");
Queue<String> queue=new ConcurrentLinkedDeque<>();
List<String> taskList= Lists.newArrayList("1号","2号","5号","7号");
queue.addAll(taskList);
ScheduledExecutorService pool= Executors.newScheduledThreadPool(1);
for(int i=0;i<queue.size();i++) {
pool.schedule(new Callable<String>() {
@Override
public String call() {
LOG.info(Thread.currentThread().getName() + " 当前执行的任务是" + queue.poll());
return "callSchedule";
}
}, 10, TimeUnit.SECONDS);
}
pool.shutdown();
}