public class BuyTask1 implements Task, Serializable { private String name = "NAME"; private ManagedReference<BuyTask2> subTaskRef = null; public BuyTask1(String name) { this.name = name; } private static final long serialVersionUID = 1L; public void run() throws Exception { try { long tim1 = System.currentTimeMillis(); System.out.println("线程执行 : " + name); DataManager dataManager = AppContext.getDataManager(); Person person = (Person) dataManager.getBinding("person"); // System.out.println("--执行购买任务--"); // System.out.println("--当前玩家金钱为 : " + ((Person) dataManager.getBinding("person")).getMoney() + "--"); // ((Person) dataManager.getBinding("person")).setMoney(((Person) // dataManager.getBinding("person")).getMoney() - 1); // System.out.println("--购买后玩家金钱为 : " + ((Person) dataManager.getBinding("person")).getMoney() + "--"); // dataManager.markForUpdate(((Person) dataManager.getBinding("person"))); System.out.println("--执行购买任务--"); System.out.println("--当前玩家金钱为 : " + person.getMoney() + "--"); person.setMoney(person.getMoney() - 1); System.out.println("--购买后玩家金钱为 : " + person.getMoney() + "--"); dataManager.markForUpdate(person); Thread.sleep(50); long time2 = System.currentTimeMillis(); System.out.println("执行内部子任务开始"); // BuyTask2 bt2_1 = new BuyTask2("2_1"); // 还是要等完1_1后才会执行... // AppContext.getTaskManager().scheduleTask(bt2_1); // bt2_1.run(); // setSubTask(bt2_1); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_0")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_1")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_2")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_3")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_4")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_5")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_6")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_7")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_8")); AppContext.getTaskManager().scheduleTask(new BuyTask2("2_9")); System.out.println("执行内部子任务结束"); System.out.println("线程结束 : " + name); System.out.println("执行了 : " + (time2 - tim1) + " 毫秒/n"); } catch (Exception e) { e.printStackTrace(); } } public void setSubTask(BuyTask2 subTask) { // 设置子任务 if (subTask == null) { subTaskRef = null; return; } DataManager dataManager = AppContext.getDataManager(); subTaskRef = dataManager.createReference(subTask); } public BuyTask2 getSubTask() { if (subTaskRef == null) { return null; } return subTaskRef.get(); } }
打印:
线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 10-- --购买后玩家金钱为 : 9-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 62 毫秒 线程执行 : 2_9 线程执行 : 2_2 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 9-- --购买后玩家金钱为 : 8-- --执行购买任务-- --当前玩家金钱为 : 9-- --购买后玩家金钱为 : 8-- --执行购买任务-- --当前玩家金钱为 : 9-- --购买后玩家金钱为 : 8-- 线程结束 : 2_9 执行了 : 62 毫秒 线程执行 : 2_1 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- 线程执行 : 2_7 --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- 线程结束 : 2_1 执行了 : 47 毫秒 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 7-- --购买后玩家金钱为 : 6-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : 7-- --购买后玩家金钱为 : 6-- 线程执行 : 2_7 --执行购买任务-- --当前玩家金钱为 : 7-- --购买后玩家金钱为 : 6-- 线程结束 : 2_7 执行了 : 63 毫秒 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : 6-- --购买后玩家金钱为 : 5-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : 6-- --购买后玩家金钱为 : 5-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : 6-- --购买后玩家金钱为 : 5-- 线程结束 : 2_3 执行了 : 47 毫秒 线程执行 : 2_6 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 5-- --购买后玩家金钱为 : 4-- --执行购买任务-- --当前玩家金钱为 : 5-- --购买后玩家金钱为 : 4-- 线程结束 : 2_6 执行了 : 47 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程结束 : 2_4 执行了 : 47 毫秒 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 线程结束 : 2_5 执行了 : 47 毫秒 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : 3-- --购买后玩家金钱为 : 2-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 3-- --购买后玩家金钱为 : 2-- 线程结束 : 2_8 执行了 : 63 毫秒 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 2-- --购买后玩家金钱为 : 1-- 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : 2-- --购买后玩家金钱为 : 1-- 线程结束 : 2_0 执行了 : 46 毫秒 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : 1-- --购买后玩家金钱为 : 0-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : 1-- --购买后玩家金钱为 : 0-- 线程结束 : 2_2 执行了 : 47 毫秒 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : 0-- --购买后玩家金钱为 : -1-- 线程结束 : 2_4 执行了 : 62 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : -1-- --购买后玩家金钱为 : -2-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 47 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : -2-- --购买后玩家金钱为 : -3-- 线程结束 : 2_1 执行了 : 47 毫秒 线程执行 : 2_7 线程执行 : 2_9 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -3-- --执行购买任务-- --当前玩家金钱为 : -3-- --购买后玩家金钱为 : -4-- --执行购买任务-- --当前玩家金钱为 : -3-- --购买后玩家金钱为 : -4-- --购买后玩家金钱为 : -4-- 线程结束 : 2_7 执行了 : 47 毫秒 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -4-- --购买后玩家金钱为 : -5-- 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -4-- --购买后玩家金钱为 : -5-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -4-- --购买后玩家金钱为 : -5-- 线程结束 : 2_9 执行了 : 47 毫秒 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -5-- --购买后玩家金钱为 : -6-- 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -5-- --购买后玩家金钱为 : -6-- 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -5-- --购买后玩家金钱为 : -6-- 线程结束 : 2_8 执行了 : 62 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -6-- --购买后玩家金钱为 : -7-- 线程结束 : 2_5 执行了 : 47 毫秒 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -7-- --购买后玩家金钱为 : -8-- 线程结束 : 2_0 执行了 : 62 毫秒 线程执行 : 2_4 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -8-- --购买后玩家金钱为 : -9-- --执行购买任务-- --当前玩家金钱为 : -8-- --购买后玩家金钱为 : -9-- 线程结束 : 2_4 执行了 : 47 毫秒 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -9-- --购买后玩家金钱为 : -10-- 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -9-- --购买后玩家金钱为 : -10-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -9-- --购买后玩家金钱为 : -10-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -9-- --购买后玩家金钱为 : -10-- 线程结束 : 2_3 执行了 : 62 毫秒 线程执行 : 2_6 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -10-- --购买后玩家金钱为 : -11-- --执行购买任务-- --当前玩家金钱为 : -10-- --购买后玩家金钱为 : -11-- 线程结束 : 2_6 执行了 : 47 毫秒 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -11-- --购买后玩家金钱为 : -12-- 线程结束 : 2_2 执行了 : 47 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : -12-- --购买后玩家金钱为 : -13-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 62 毫秒 线程执行 : 2_7 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -13-- --购买后玩家金钱为 : -14-- --执行购买任务-- --当前玩家金钱为 : -13-- --购买后玩家金钱为 : -14-- 线程执行 : 2_4 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -13-- --执行购买任务-- --当前玩家金钱为 : -13-- --购买后玩家金钱为 : -14-- --购买后玩家金钱为 : -14-- 线程结束 : 2_8 执行了 : 78 毫秒 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -14-- --购买后玩家金钱为 : -15-- 线程结束 : 2_4 执行了 : 47 毫秒 线程执行 : 2_7 --执行购买任务-- --当前玩家金钱为 : -15-- --购买后玩家金钱为 : -16-- 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -15-- --购买后玩家金钱为 : -16-- 线程结束 : 2_7 执行了 : 63 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -16-- --购买后玩家金钱为 : -17-- 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -16-- --购买后玩家金钱为 : -17-- 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -16-- --购买后玩家金钱为 : -17-- 线程结束 : 2_0 执行了 : 47 毫秒 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -17-- --购买后玩家金钱为 : -18-- 线程结束 : 2_9 执行了 : 47 毫秒 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_5 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -18-- --购买后玩家金钱为 : -19-- 线程结束 : 2_2 执行了 : 47 毫秒 线程执行 : 2_6 线程执行 : 2_1 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -19-- --购买后玩家金钱为 : -20-- --执行购买任务-- --当前玩家金钱为 : -19-- --购买后玩家金钱为 : -20-- --执行购买任务-- 线程执行 : 2_3 --当前玩家金钱为 : -19-- --购买后玩家金钱为 : -20-- --执行购买任务-- --当前玩家金钱为 : -19-- --购买后玩家金钱为 : -20-- 线程结束 : 2_1 执行了 : 47 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -20-- --购买后玩家金钱为 : -21-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -20-- --购买后玩家金钱为 : -21-- 线程结束 : 2_3 执行了 : 47 毫秒 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -21-- --购买后玩家金钱为 : -22-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -21-- --购买后玩家金钱为 : -22-- 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -21-- --购买后玩家金钱为 : -22-- 线程结束 : 2_5 执行了 : 47 毫秒 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -22-- --购买后玩家金钱为 : -23-- 线程结束 : 2_6 执行了 : 62 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : -23-- --购买后玩家金钱为 : -24-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 47 毫秒 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -24-- --购买后玩家金钱为 : -25-- 线程结束 : 2_3 执行了 : 47 毫秒 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -25-- --购买后玩家金钱为 : -26-- 线程结束 : 2_9 执行了 : 47 毫秒 线程执行 : 2_2 线程执行 : 2_6 --执行购买任务-- --执行购买任务-- --当前玩家金钱为 : -26-- --购买后玩家金钱为 : -27-- --当前玩家金钱为 : -26-- --购买后玩家金钱为 : -27-- 线程结束 : 2_2 执行了 : 46 毫秒 线程执行 : 2_7 --执行购买任务-- --当前玩家金钱为 : -27-- --购买后玩家金钱为 : -28-- 线程结束 : 2_7 执行了 : 47 毫秒 线程执行 : 2_6 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -28-- --购买后玩家金钱为 : -29-- --执行购买任务-- --当前玩家金钱为 : -28-- --购买后玩家金钱为 : -29-- 线程结束 : 2_6 执行了 : 62 毫秒 线程执行 : 2_8 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -29-- --购买后玩家金钱为 : -30-- --执行购买任务-- --当前玩家金钱为 : -29-- --购买后玩家金钱为 : -30-- 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -29-- --购买后玩家金钱为 : -30-- 线程结束 : 2_8 执行了 : 47 毫秒 线程执行 : 2_1 线程执行 : 2_0 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -30-- --购买后玩家金钱为 : -31-- --执行购买任务-- --当前玩家金钱为 : -30-- --购买后玩家金钱为 : -31-- --执行购买任务-- --当前玩家金钱为 : -30-- --购买后玩家金钱为 : -31-- 线程结束 : 2_1 执行了 : 78 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -31-- --购买后玩家金钱为 : -32-- 线程执行 : 2_4 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -31-- --购买后玩家金钱为 : -32-- --执行购买任务-- --当前玩家金钱为 : -31-- --购买后玩家金钱为 : -32-- 线程结束 : 2_5 执行了 : 47 毫秒 线程执行 : 2_0 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -32-- --购买后玩家金钱为 : -33-- --执行购买任务-- --当前玩家金钱为 : -32-- --购买后玩家金钱为 : -33-- 线程结束 : 2_4 执行了 : 47 毫秒 线程执行 : 2_0 --执行购买任务-- --当前玩家金钱为 : -33-- --购买后玩家金钱为 : -34-- 线程结束 : 2_0 执行了 : 47 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : -34-- --购买后玩家金钱为 : -35-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 62 毫秒 线程执行 : 2_5 --执行购买任务-- --当前玩家金钱为 : -35-- --购买后玩家金钱为 : -36-- 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : -35-- --购买后玩家金钱为 : -36-- 线程结束 : 2_5 执行了 : 63 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : -36-- --购买后玩家金钱为 : -37-- 线程执行 : 2_8 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -36-- --购买后玩家金钱为 : -37-- --执行购买任务-- --当前玩家金钱为 : -36-- --购买后玩家金钱为 : -37-- 线程结束 : 2_1 执行了 : 47 毫秒 线程执行 : 2_8 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -37-- --购买后玩家金钱为 : -38-- --执行购买任务-- --当前玩家金钱为 : -37-- --购买后玩家金钱为 : -38-- 线程执行 : 2_3 --执行购买任务-- --当前玩家金钱为 : -37-- --购买后玩家金钱为 : -38-- 线程执行 : 2_7 --执行购买任务-- --当前玩家金钱为 : -37-- --购买后玩家金钱为 : -38-- 线程结束 : 2_7 执行了 : 63 毫秒 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -38-- --购买后玩家金钱为 : -39-- 线程执行 : 2_9 --执行购买任务-- --当前玩家金钱为 : -38-- --购买后玩家金钱为 : -39-- 线程结束 : 2_9 执行了 : 62 毫秒 线程执行 : 2_3 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -39-- --购买后玩家金钱为 : -40-- --执行购买任务-- --当前玩家金钱为 : -39-- --购买后玩家金钱为 : -40-- 线程结束 : 2_3 执行了 : 47 毫秒 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -40-- --购买后玩家金钱为 : -41-- 线程执行 : 2_0 线程执行 : 2_8 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -40-- --购买后玩家金钱为 : -41-- --执行购买任务-- --当前玩家金钱为 : -40-- --购买后玩家金钱为 : -41-- --执行购买任务-- --当前玩家金钱为 : -40-- --购买后玩家金钱为 : -41-- 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -40-- --购买后玩家金钱为 : -41-- 线程结束 : 2_0 执行了 : 78 毫秒 线程执行 : 2_6 线程执行 : 2_2 --执行购买任务-- --当前玩家金钱为 : -41-- --购买后玩家金钱为 : -42-- --执行购买任务-- --当前玩家金钱为 : -41-- --购买后玩家金钱为 : -42-- 线程结束 : 2_2 执行了 : 47 毫秒 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -42-- --购买后玩家金钱为 : -43-- 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -42-- --购买后玩家金钱为 : -43-- 线程执行 : 2_4 --执行购买任务-- --当前玩家金钱为 : -42-- --购买后玩家金钱为 : -43-- 线程结束 : 2_4 执行了 : 62 毫秒 线程执行 : 2_6 --执行购买任务-- --当前玩家金钱为 : -43-- --购买后玩家金钱为 : -44-- 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -43-- --购买后玩家金钱为 : -44-- 线程结束 : 2_6 执行了 : 47 毫秒 线程执行 : 2_8 --执行购买任务-- --当前玩家金钱为 : -44-- --购买后玩家金钱为 : -45-- 线程结束 : 2_8 执行了 : 62 毫秒
结论:
经过测试:父任务未完成情况下,子类任务是不会执行的;处于同一父任务下的子任务,会出现并发,且不能锁住持有的相同属性,导致异步属性的修改错误.故,一个任务超时,可以分解为多个子任务,且最好以个父任务对应一个子任务.当然若子任务操作的属性不相同,可以处于同一父任务,通过并发加快程序执行效率.
PS.SGS服务器中的所有函数都是一个Task,都会因为100ms超时而导致再执行,可能导致死循环.故,效率第一...