public class Person implements ManagedObject,Serializable { private static final long serialVersionUID = 1L; private String username = "Vicky"; private String password = "123456"; private Integer money = 10; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getMoney() { return money; } public void setMoney(Integer money) { this.money = money; } }
public class MainApp implements AppListener, Serializable { private static final long serialVersionUID = 1L; public static final long TIME = 2000; public void initialize(Properties properties) { Person person = new Person(); DataManager dataManager = AppContext.getDataManager(); dataManager.setBinding("person", person); BuyTask1 bt1_1 = new BuyTask1("1_1"); //BuyTask1 bt1_2 = new BuyTask1("1_3"); //BuyTask1 bt1_3 = new BuyTask1("1_3"); //BuyTask2 bt2_1 = new BuyTask2("2_1"); //BuyTask2 bt2_2 = new BuyTask2("2_2"); //BuyTask2 bt2_3 = new BuyTask2("2_3"); TaskManager taskManager = AppContext.getTaskManager(); taskManager.schedulePeriodicTask(bt1_1, TIME, TIME); //taskManager.schedulePeriodicTask(bt1_2, TIME, TIME); //taskManager.schedulePeriodicTask(bt1_3, TIME, TIME); //taskManager.schedulePeriodicTask(bt2_1, TIME, TIME); //taskManager.schedulePeriodicTask(bt2_2, TIME, TIME); //taskManager.schedulePeriodicTask(bt2_3, TIME, TIME); System.out.println("执行初始化"); } public ClientSessionListener loggedIn(ClientSession clientsession) { return null; } }
public class BuyTask1 implements Task, Serializable { private String name = "NAME"; public BuyTask1(String name) { this.name = name; } private static final long serialVersionUID = 1L; public void run() throws Exception { 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(90); long time2 = System.currentTimeMillis(); System.out.println("执行内部子任务开始"); BuyTask2 bt2_1 = new BuyTask2("2_1"); // 还是要等完1_1后才会执行... AppContext.getTaskManager().scheduleTask(bt2_1); System.out.println("执行内部子任务结束"); System.out.println("线程结束 : " + name); System.out.println("执行了 : " + (time2 - tim1) + " 毫秒/n"); } }
public class BuyTask2 implements Task, Serializable { private String name = "NAME"; public BuyTask2(String name) { this.name = name; } private static final long serialVersionUID = 1L; public void run() throws Exception { 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(90); long time2 = System.currentTimeMillis(); System.out.println("线程结束 : " + name); System.out.println("执行了 : " + (time2 - tim1) + " 毫秒/n"); } }
2010-2-9 10:48:58 com.sun.sgs.impl.kernel.Kernel <init> 信息: The Kernel is ready, version: 0.9.11 2010-2-9 10:48:58 com.sun.sgs.impl.service.data.store.DataStoreImpl <init> 信息: Creating database directory : G:/游戏项目/测试SGS线程是否同步/data/MainApp/dsdb 2010-2-9 10:49:02 com.sun.sgs.impl.service.watchdog.WatchdogServerImpl registerNode 信息: node:com.sun.sgs.impl.service.watchdog.NodeImpl[1,health:GREEN,backup:(none)]@WWW-D3818AE4573 registered 执行初始化 2010-2-9 10:49:03 com.sun.sgs.impl.kernel.Kernel startApplication 信息: MainApp: application is ready 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 10-- --购买后玩家金钱为 : 9-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 94 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 9-- --购买后玩家金钱为 : 8-- 线程结束 : 2_1 执行了 : 93 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 8-- --购买后玩家金钱为 : 7-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 94 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 7-- --购买后玩家金钱为 : 6-- 线程结束 : 2_1 执行了 : 94 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 6-- --购买后玩家金钱为 : 5-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 94 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 5-- --购买后玩家金钱为 : 4-- 线程结束 : 2_1 执行了 : 94 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 4-- --购买后玩家金钱为 : 3-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 94 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 3-- --购买后玩家金钱为 : 2-- 线程结束 : 2_1 执行了 : 93 毫秒 线程执行 : 1_1 --执行购买任务-- --当前玩家金钱为 : 2-- --购买后玩家金钱为 : 1-- 执行内部子任务开始 执行内部子任务结束 线程结束 : 1_1 执行了 : 94 毫秒 线程执行 : 2_1 --执行购买任务-- --当前玩家金钱为 : 1-- --购买后玩家金钱为 : 0-- 线程结束 : 2_1 执行了 : 94 毫秒
线程执行 : 1_1
--执行购买任务--
--当前玩家金钱为 : 10--
--购买后玩家金钱为 : 9--
执行内部子任务开始
执行内部子任务结束
线程结束 : 1_1
执行了 : 94 毫秒
通过红色字体可见,虽然在一个Task中执行了另外一个Task,但该task并不会立刻执行,而需要在父类task执行后才会执行.也就是一个1_1的task在执行中,触发了另外一个2_1的task的执行,但该2_1并不会立刻执行,而是等待1_1执行完成后才会执行.且,执行时间为94毫秒,可见,的确2_1并非执行完成后才会继续执行1_1...这就是Task的单线程机制.所有的task并非同多线程一样,可以并发执行.而是需要先到的执行完成后,再执行后面的task,即便该task是另外一个task中内部的任务.