使用java.util.concurrent包编写一个延时执行的任务
来源:互联网 发布:旺格子软件 编辑:程序博客网 时间:2024/06/04 19:07
package com.letv.lazybox.task;/** 若干参赛者参加竞走比赛,每组比赛有规定不同的全程米数,总赛时长;运动员若在规定赛时未跑完全程则出局;最后输出比赛成绩*/import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class TaskContraller { public static void main(String[] args) { // 初始化 ConcurrentHashMap<String, WalkingTask> walktaskmap = new ConcurrentHashMap<String, WalkingTask>(); Player tom = new Player("Tom", 10, 2000, 30); Player kitty = new Player("kitty", 80, 3000, 10); walktaskmap.put("Tom", new WalkingTask(tom)); walktaskmap.put("kitty", new WalkingTask(kitty)); // 创建存放结果状态的列表 List<Future<Player>> futureList = new ArrayList<Future<Player>>(); System.out.println("StartTime=" + new SimpleDateFormat("HH:mm:ss").format(new Date(System .currentTimeMillis()))); // 创建线程池 final ScheduledExecutorService pool = Executors .newScheduledThreadPool(50); Iterator<String> ite = walktaskmap.keySet().iterator(); while (ite.hasNext()) { String name = ite.next(); WalkingTask walkingTask = walktaskmap.get(name); System.out.println(name + " is ready to walking...!"); // (异步)立即开始执行比赛任务 Future<Player> future = pool.submit(walkingTask); // (异步)延时执行停止任务 StopTask stopTask = new StopTask(walktaskmap, name); pool.schedule(stopTask, walkingTask.getPlayer().getTotalSeconds(), TimeUnit.SECONDS); futureList.add(future); } System.out.println(".....main thread...."); // 异步等待结束输出结果 try { for (Future<Player> fu : futureList) { Player player = fu.get(); System.out.println("result-------->\n" + player.toString()); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { // 关闭线程池:当前未完成线程接续执行,不再接受新线程 pool.shutdown(); } }}/** * 竞走比赛任务类:有返回值 */class WalkingTask implements Callable<Player> { private boolean isStop = false;// 是否中止比赛 private Player player;// 运动员 public boolean isStop() { return this.isStop; } public void setStop(boolean isStop) { this.isStop = isStop; } public Player getPlayer() { return this.player; } public void setPlayer(Player player) { this.player = player; } public WalkingTask(Player player) { this.player = player; } @Override public Player call() { for (int i = 1; i <= this.player.getMeters(); i++) { try { Thread.sleep(this.player.getMillsecond()); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.player.getName() + " run:" + i + " m!"); if (this.isStop) { Result res = new Result(false, i, this.player.getMillsecond() * i / 1000); this.player.setResult(res); return this.player; } } this.player.setResult(new Result(true, this.player.getMeters(), this.player.getMillsecond() * this.player.getMeters() / 1000)); return this.player; }}/** * 通知比赛中止任务类:无返回值 */class StopTask implements Runnable { private final String key;// 运动员姓名 private final ConcurrentHashMap<String, WalkingTask> mytasks; public StopTask(ConcurrentHashMap<String, WalkingTask> mytasks, String name) { this.mytasks = mytasks; this.key = name; } @Override public void run() { this.mytasks.get(this.key).setStop(true); String endTime = new SimpleDateFormat("HH:mm:ss").format(new Date( System.currentTimeMillis())); System.out.println("[ " + this.key + " ] GAME OVER ! EndTime =" + endTime); }}/** * 运动员 */class Player { private String name;// 姓名 private int meters;// 参赛总里程数 private int millsecond;// 每跑一米用时 private int totalSeconds;// 总赛时 private Result result;// 成绩 public Player(String name, int meters, int millsecond, int totalSeconds) { this.name = name; this.meters = meters; this.millsecond = millsecond; this.totalSeconds = totalSeconds; } public Result getResult() { return this.result; } public void setResult(Result result) { this.result = result; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getMeters() { return this.meters; } public void setMeters(int meters) { this.meters = meters; } public int getMillsecond() { return this.millsecond; } public void setMillsecond(int millsecond) { this.millsecond = millsecond; } public int getTotalSeconds() { return this.totalSeconds; } public void setTotalSeconds(int totalSeconds) { this.totalSeconds = totalSeconds; } @Override public String toString() { return "Player [name=" + this.name + ", meters=" + this.meters + ", millsecond=" + this.millsecond + ", totalSeconds=" + this.totalSeconds + ", result=" + this.result.toString() + "]"; }}/** * 比赛成绩 */class Result { private boolean finished;// 是否完成 private int meters;// 跑了多少米 private int times;// 用时 public Result(boolean finished, int meters, int times) { this.finished = finished; this.meters = meters; this.times = times; } public boolean getFinished() { return this.finished; } public void setFinished(boolean finished) { this.finished = finished; } public int getMeters() { return this.meters; } public void setMeters(int meters) { this.meters = meters; } public int getTimes() { return this.times; } public void setTimes(int times) { this.times = times; } @Override public String toString() { return "Result [finished=" + this.finished + ", meters=" + this.meters + ", times=" + this.times + "]"; }}
0 0
- 使用java.util.concurrent包编写一个延时执行的任务
- java.util.concurrent包 以及 线程池的使用。
- java.util.concurrent包中线程池Executors的使用
- 使用java.util.concurrent包处理多线程
- java.util.concurrent包(5)-CountDownLatch使用
- java.util.concurrent包(6)-CyclicBarrier使用
- java.util.concurrent包(7)-Exchanger使用
- 使用java.util.concurrent包处理多线程
- java.util.concurrent包
- java.util.concurrent包
- java.util.concurrent包
- java.util.concurrent包
- java.util.concurrent包的分析
- jdk1.5中java.util.concurrent包编写多线程(一)
- concurrent包:java.util.concurrent.atomic
- java.util.concurrent包探秘
- Java.Util.concurrent包学习
- java.util.concurrent.locks包
- 线段树学习
- android重写系列(1)——titleTag actionbar 重写(整理来自慕课网)
- 学习MySQL的参考资料
- 第十一周 项目3-点类派生直线类
- 我的前端学习历程
- 使用java.util.concurrent包编写一个延时执行的任务
- JSTL和EL基础
- Mac Chrome快捷键
- 设计模式初体验---单一职责原则SRP
- LeetCode---(19)Remove Nth Node From End of List
- Android Binder机制(超级详尽)
- Android笔记之TextView内部文字样式自定义
- 监听Home和Back物理按键的学习总结
- APP开发要么快要么死!