在Java等

时间:2011-12-29 05:27:07

标签: java awt

我有一个模拟汽车结构的java程序。我写了一个解释,但这很难理解而且不是很有用,所以我只会问“抽象”的问题。

我有一个无限循环,它调用方法“现在”,告诉结构建造一辆新车。

    while(true){
        try{
            Thread.sleep(500);
        }catch (Exception e) {;}
        fabric.now();
    }

织物内部有3个区域;第0阶段,汽车的车身被创建,第1阶段,汽车有灯,第2阶段,我在上面放了一个保险杠,完成了所有成品车放置的地方。

当第一次调用menthod now时,它会在第0阶段创建汽车车身。然后,当它第二次被调用时,它会将第一个车身移动到第1阶段,它放置汽车的灯光(通过画两个圆圈),它创造了一个新的身体。它继续这样,直到汽车准备好,这是它被移动到完成区域。

这是我的问题。我第二次调用now方法,它做了3件事:

我。它在1级中描绘了车身 II。它在0阶段描绘了一个新的车身 III。它在一个舞台上描绘了车身上的灯光。

我想推迟步骤(iii),以便人们可以看到汽车正在提供灯光。如果我使用等待thread.sleep,或者进行一个需要x毫秒的循环,它会延迟整个结构。 我认为我需要的是将(iii)步骤从正常流程中取出并单独进行,因此当我在绘制灯光之前等待350毫秒时,它不会延迟制造过程的其余部分。 (其余的绘画)。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

以下是我对您的问题的假设: 你想以500ms的常规间隔调用now()方法。现在不管你想在now()中延迟子任务3。这也意味着子任务3的延迟不应该每隔500毫秒延迟调用now()

如果这是您的要求,我建议您使用java.util.Timer.scheduleAtFixedRate

只需创建一个TimerTask并将now()调用包装在其中。

在子任务3中使用wait(500)或你想要多少。

答案 1 :(得分:0)

这有点复杂,但应该很好地扩展。

  1. 实施事件队列
  2. 让每个事件执行正确的函数调用,然后将下一个事件添加到队列
  3. 您可以通过制作更多活动(即启动或拆除活动)来延长

    interface QueueEvent{
      void perform(EventQueue q);
    }
    
    class Stage0CarEvent implements QueueEvent{
      public void perform(EventQueue q){
        fabric.drawStage0Car();
        q.push(new Stage1CarEvent(),500);
      }
    }
    
    class Stage1CarEvent implements QueueEvent{
      public void perform(EventQueue q){
        fabric.drawStage1Car();
        q.push(new AddLightsEvent(),350);
        q.push(new Stage2CarEvent(),500);
      }
    }
    
    // other events...
    
    class EventQueue{
      void run(){
        while(true){
          // get the next event
          // wait an amount of time needed for the next event
          event.perform(this);
        }
      }
    
      void push(QueueEvent event,int t){
        //insert the next event t time units from now
      }
    }