在Java中等待

在Java中等待,java,awt,Java,Awt,我有一个模拟汽车结构的java程序。我写了一个解释,但它很难理解,也没有真正的用处,所以我只想问一个“抽象”的问题 我有一个无限循环,它调用方法“now”,它告诉织物制造一辆新车 while(true){ try{ Thread.sleep(500); }catch (Exception e) {;} fabric.now(); } 在织物内部有3个区域;第0阶段是创建车身的阶段,第1阶段是为汽车提供灯光的

我有一个模拟汽车结构的java程序。我写了一个解释,但它很难理解,也没有真正的用处,所以我只想问一个“抽象”的问题

我有一个无限循环,它调用方法“now”,它告诉织物制造一辆新车

    while(true){
        try{
            Thread.sleep(500);
        }catch (Exception e) {;}
        fabric.now();
    }
在织物内部有3个区域;第0阶段是创建车身的阶段,第1阶段是为汽车提供灯光的阶段,第2阶段是我在其上安装保险杠并完成的阶段,这是放置所有成品汽车的位置

当第一次调用menthod
now
时,它将在阶段0中创建车身。然后,当第二次调用它时,它将第一个车身移动到第1阶段,它放置汽车的灯光(通过绘制两个圆圈),并创建一个新车身。它一直这样走,直到汽车准备好,也就是说,当它移动到成品区

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

一,。它在1阶段绘制车身
二,。它在0阶段绘制了一个新车身
三、1级车身上的灯

我想推迟第(三)步,这样人们就可以看到车上有灯了。如果我使用wait、
thread.sleep
,或者执行一个耗时x毫秒的周期,那么从那时起整个结构都会延迟。 我想我需要的是将(iii)步从正常流程中分离出来,并单独进行,因此当我在喷漆前等待350毫秒时,不会延迟其余的制造过程。(这幅画的其余部分)


有什么想法吗?

以下是我对你的问题的假设: 您希望以500毫秒的固定间隔调用now()方法。现在,无论使用何种方式,都要延迟Now()中的子任务3。这也意味着子任务3中的延迟不应每500毫秒延迟对now()的调用

如果这是您的要求,那么我建议您使用

只需创建一个函数并将now()调用封装在其中


在子任务3中使用wait(500)或您想要的值。

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

  • 实现一个事件队列
  • 让每个事件执行适当的函数调用,然后将下一个事件添加到队列中
  • 您可以通过创建更多事件(即启动或拆卸事件)进行扩展


  • 您可以在fabric.now()中的第二步和第三步之间进行延迟,然后减少主要延迟以进行补偿。您可以进一步将其抽象化吗?我在努力理解,但很难理解。
    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
      }
    }