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

Java 执行代码太快。需要放慢速度,但如何?,java,Java,从下面的代码 if(!validate_containsNum && !validate_isNumber && !validate_isBlankField){ a.sendMsgToSlave("DATA:TAKE:PEOPLEs:"+pName_sub); appendToGlobalDataLog("SEND : DATA:TAKE:PEOPLEs:"+pID+":"+p_sub);

从下面的代码

  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);
实际上是调用我的客户机从peoples表中获取数据,以获取pID,该pID将返回到下一行应该执行的JTEXTFIELD

     String pID = pID_Manage.getText();  
但是下一行的任务是向arraylist中添加特定的字符串,它包含pID和pName_Sub的组合,但是当执行它时,我发现我的arraylist中没有pID..因此,实际结果应该是这样的

     DATA:TAKE:PEOPLEs:1:ALBERT  (In my arraylist)
     DATA:TAKE:PEOPLEs::ALBERT (the id is missing)
它是这样显示的

     DATA:TAKE:PEOPLEs:1:ALBERT  (In my arraylist)
     DATA:TAKE:PEOPLEs::ALBERT (the id is missing)

我需要再次提交第二次才能获得ID…似乎代码的执行太快,返回JTEXTFIELD的ID存储速度太慢..有什么方法可以减慢它吗?

快速而肮脏的解决方案是调用
线程.睡眠
,但更好的解决方案是在
a.sendMsgToSlave()中修改代码
仅在设置id后返回。这样,您就可以肯定地知道,当执行到达
sendMsgToSlave()
之后的语句时,每次都肯定会准备好ID。

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

以下是您的解决方案:
将changelistener置于jtextfield pID_管理上
并在其中调用数组填充方法

因此,只有在接收到id并将其分配给jtextfield时才会填充数组。

以下是您的解决方案:
将changelistener置于jtextfield pID_管理上
并在其中调用数组填充方法

因此,只有在接收到id并将其分配给jtextfield时才会填充数组。

您的
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);
}};

因此,基本思想是侦听器对适当的事件做出反应,并在触发时立即注销自己。

您的
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);
}};

因此,基本的想法是侦听器对适当的事件做出反应,并在触发时立即注销自己。

我不确定这是否有效,但对于尝试防止哈希中的rainbow表和其他安全问题,可以执行以下操作

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

也许能奏效。但我也从未测试过,这只是一个建议,我不确定这是否有效,但对于试图防止哈希表中出现彩虹表和其他安全问题的情况,可以做如下操作

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

也许能奏效。但我也从未测试过,这只是一个建议

这不是代码执行太快的情况,这是一个竞争条件。正确的解决方案是
a.sendMsgToSlave()
在计算和存储从机的PID之前阻塞,或者
a.sendMsgToSlave()
返回PID。实际上,最好的解决方案是将这两者结合在一起。这不是代码执行太快的情况,这是一种竞争条件。正确的解决方案是
a.sendMsgToSlave()
在计算和存储从机的PID之前阻塞,或者
a.sendMsgToSlave()
返回PID。事实上,最好的解决方案是将这两种方法结合在一起。嗯,我是这个changelistener的新手。我似乎无法将我的jtextfield添加到其中…我在使用eclipse时键入了我的pID\u Manage.addChange,我看到了与之相关的第n个。正如我所说的,我在近似代码,对此表示抱歉。看了一眼
JTextField
之后,我不确定该使用哪个侦听器。可以是
VetoableChangeListener
,但不要相信我的话。嗯,我是这个changelistener的新手。我似乎无法将我的jtextfield添加到其中…我在使用eclipse时键入了我的pID\u Manage.addChange,我看到了与之相关的第n个。正如我所说的,我正在接近代码,对此感到抱歉。看了一眼
JTextField
之后,我不确定该使用哪个侦听器。可以是
VetoableChangeListener
,但不要相信我的话。彩虹表与修复比赛条件有什么关系?对不起,我想通过添加无意义的东西来减缓比赛速度,我见过php脚本这样做,因此尝试生成rainbow表需要花费1000倍的时间,因为它必须执行1000次循环times@Luke但是真正的黑客在使用之前只会删除代码中浪费时间的部分。请阅读,以获得处理此类安全问题的正确方法。彩虹表与修复竞赛条件有何关系?对不起,我有点不了解