为事件安排任务

时间:2014-03-05 14:22:49

标签: java timer timertask

我想安排一次性任务,为什么以及是什么情况:

案例 我有一个有多个赛事的比赛,例如一场有3场比赛的纸牌比赛,每个'比赛'让用户赢得3场比赛中的2场赢得比赛。

匹配3场比赛中的1场比赛 比赛2场比赛最好的3场比赛 比赛3场比赛中最好的3场

现在我想每3分钟开始一场比赛,每场比赛需要1分钟,例如

小时 - 游戏

  1. 00:00开始比赛1并开始第1场比赛的第1场
  2. 00:01比赛第1场比赛结束
  3. 00:01开始第1场比赛的第2场
  4. 00:02比赛第1场比赛结束
  5. 00:02开始第1场比赛的第3场
  6. 00:03第1场比赛第3场结束
  7. 00:03 End Match 1
  8. 当然,每个任务只需要启动一次,永远不会再发生(它会再次发生,但不会发生相同的玩家/游戏ID /匹配ID)

    所以我认为我应该做的是创建一个可运行的匹配任务,并且可运行的将为每个游戏创建一个任务。游戏任务完成后,我应该关闭该线程,或者还有其他一些方法可以启动上述情况吗?

    我已经阅读了很多关于Timer en ScheduledExecutorService类的内容,但其中哪一项是最好的还有另一个更好的例子?

    谢谢你的时间!

    编辑:

    当你问一个问题之后总是找到一些东西。所以我会在这里发布我的课程,这不是动态类,而是测试类。 Runable现在在我需要的时候运行,我唯一的问题是,当runable执行并完成后,他将从线程中删除。或者在这些事件的100.000.000事件之后线程是否会变满?

     import java.util.Timer;
     import java.util.TimerTask;
    
     import com.ibm.icu.util.GregorianCalendar;
    
     public class TaskScheduler {
    
    public static GregorianCalendar result = new GregorianCalendar(2014, 2, 5, 15, 54, 0);
    public static GregorianCalendar resulta = new GregorianCalendar(2014, 2, 5, 15, 55, 00);
    
    public static void main(String[] args) throws InterruptedException {
    
    
        System.out.println("First thing: " + result.getTime());
        System.out.println("second thing: " + resulta.getTime());
    
    
        createNewTimerTask(1);
        createNewTimerTask(21);
        createNewTimerTask(31);
        createNewTimerTask(41);
        createNewTimerTask(51);
        createNewTimerTask(61);
        createNewTimerTask(71);
        createNewTimerTask(81);
        createNewTimerTask(91);
        createNewTimerTask(01);
        createNewTimerTask(111);
        createNewTimerTask(122);
        createNewTimerTask(133);
        createNewTimerTask(144);
        createNewTimerTask(155);
        createNewTimerTask(166);
        createNewTimerTask(177);
    }
    
    private static void createNewTimerTask(int id) {
        Timer myTimer = new Timer();
        myTimer.schedule(new Test(id), resulta.getTime());
    }
     }
    
    
    
     class Test extends TimerTask {
    public static GregorianCalendar result = new GregorianCalendar(2014, 2, 5, 15, 52, 0);
    private int id;
    
    Test(int id) {
        this.id = id;
    }
    
    @Override
    public void run() {
        try {
            Thread.sleep(5000l);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        System.out.println("ID: " + id);
    }
    }
    

1 个答案:

答案 0 :(得分:0)

定时器任务终止后,它将被垃圾收集。在100 000 000个事件之后,创建另一个计时器任务将正常运行。