执行代码太快..需要放慢速度,但如何?

时间:2012-04-13 19:19:46

标签: java

来自以下代码

  if(!validate_containsNum && !validate_isNumber && !validate_isBlankField){
                a.sendMsgToSlave("DATA:TAKE:PEOPLEs:"+pName_sub);
                appendToGlobalDataLog("SEND : DATA:TAKE:PEOPLEs:"+pID+":"+p_sub);
                String pID = pID_Manage.getText();  
                a.addtoArrayList("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
                at.sendToServer("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);



        }

从上面的代码我有一个问题,这行

      a.sendMsgToSlave("DATA:TAKE:PEOPLEs:"+pName_sub);

实际上是调用我的客户端从人员TABLE中获取数据,以获得返回的pID,这将返回到应该执行下一行的JTEXTFIELD

     String pID = pID_Manage.getText();  

然后至于下一行作业是将某些String添加到具有pID和pName_Sub组合的arraylist中但是当执行它时我发现我的arraylist没有pID..so而不是真实的结果应该是这样的

     DATA:TAKE:PEOPLEs:1:ALBERT  (In my arraylist)

它显示如下

     DATA:TAKE:PEOPLEs::ALBERT (the id is missing)

我需要再次重新提交第二次才能获得ID ...似乎代码的执行速度太快而且存储ID以回到JTEXTFIELD很慢..任何减缓速度的方法?

4 个答案:

答案 0 :(得分:1)

快速而肮脏的解决方案是调用Thread.Sleep,但更好的解决方案是修改a.sendMsgToSlave()中的代码,只有在设置了id后才返回。这样你就可以确定当执行到sendMsgToSlave()之后的语句时,你肯定每次都准备好ID。

答案 1 :(得分:1)

您的sendMsgToSlave启动一个异步事件链,导致文本字段稍后更新。您应该修改您的体系结构,以便依赖于所设置的ID字段的代码运行以响应实际发生的事件。正如其他人所提到的,你可以让sendMsgToSlave同步,但从它的名字来看,我认为这不是一个好主意。您可以做的是将更改侦听器附加到将执行剩余任务的ID字段。我会近似,因为我不知道你需要的确切听众:

pID_Manager.addChangeListener(new ChangeListener() { 
  public void textChanged(ChangeEvent e) {
    pID_manager.removeChangeListener(this);
    String pID = pID_Manage.getText();  
    a.addtoArrayList("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
    at.sendToServer("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
}};

所以基本的想法是听众对适当的事件作出反应,并在发射时立即取消注册。

答案 2 :(得分:0)

以下是您的解决方案:
将changelistener放在jtextfield pID_Manage上 并在其中调用您的数组填充方法
这样只有在收到id并将其分配给jtextfield时才会填充数组。

答案 3 :(得分:-1)

我不确定这是否有效,但是有些事情,比如试图在哈希和其他安全问题中防止彩虹表,做类似的事情

for(int i = 0; i < 100; i++) {
}

可能会成功。但我再也没有测试过这个,这只是一个建议