从数组中获取下一个int

时间:2016-03-25 19:23:13

标签: java multithreading

我有一个按钮,点击它会导致线程休眠x个时间。

我希望线程能够从数组中获取时间。

这是应该发生的事情:

  1. 单击按钮,选择第一个数字
  2. 线程睡觉然后做它的事
  3. 完成它需要做的事后,选择下一个号码并重复该过程直到没有更多号码。
  4. 我到目前为止的代码是:

    private int[] intArray = new int[]{4, 3, 6, 2, 5};
    
    public void myMethod() {
        try {
            int x = 0;
            for (int i = 0; i < intArray.length; i++) {
               x = intArray[i];
            }
    
            Thread.sleep(x);
    
            // my custom things happen here after the thread sleep
    
        } catch (InterruptedException ex) {
            Logger.getLogger(RoutePanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    }
    

4 个答案:

答案 0 :(得分:1)

sleep和“自定义内容”应位于for循环中。

private int[] intArray = new int[]{4, 3, 6, 2, 5};
public void myMethod() {
  try {
    int x = 0;
    for (int i = 0; i < intArray.length; i++) {
      x = intArray[i];
      Thread.sleep(x);
      // my custom things happen here after the thread sleep
   }
  } catch (InterruptedException ex) {
    Logger.getLogger(RoutePanel.class.getName()).log(Level.SEVERE, null, ex);
  }
}

答案 1 :(得分:0)

    for (int i = 0; i < intArray.length; i++) {
       x = intArray[i];
    }

    Thread.sleep(x);

此代码遍历整个数组,并且每次都覆盖x的值,始终x设置为遇到的最后一个值(在您的情况下是5

sleep(5);

睡5 毫秒

答案 2 :(得分:0)

除了你的问题的前提,每次都会抛出一个ArrayIndexOutOfBoundsException。 intArray.length可能给出5,但intArray [5]给出异常,因为它不存在。由于数组是从零开始的,因此可以使用intArray [0] - intArray [4],因此请使用intArray.length-1。

现在,关于你的问题,即使你确实有intArray [5]可用,它每次都会睡眠那么长,因为循环完成,x的最后一个赋值将是数组的最后一个元素。

  1. 删除循环
  2. 在myMethod()
  3. 之外移动x的实例化
  4. 每次点击按钮时增加x
  5. 请务必检查(x == intArray.length),如果是,请指定x = 0.否则,您将再次获得ArrayIndexOutOfBoundsException。

    P.S。 Thread.sleep()需要几毫秒,所以如果你想要秒,分别使用4000,3000,6000,2000,5000。

答案 3 :(得分:0)

听起来你有不止一个问题:

  

从数组中获取下一个int

这很容易。问题是你需要一个 persistent 变量(即,在某个事件处理程序中不是局部变量)来记住数组中下一个条目的索引:

private int[] intArray = new int[]{4, 3, 6, 2, 5};
private int next_index = 0;

private boolean hasNext() {
    return next_index < intArray.length;
}

private int getNext() {
    return intArray[next_index++];
}
  

我有一个按钮,点击它会导致线程休眠x个时间。

这听起来不错。更具体地说,“导致线程休眠”不是一个线程可以对另一个线程做的事情。线程可以通过调用Thread.sleep(nnnn)使本身进入睡眠状态。

Thread.sleep()不是你应该在事件处理程序中做的事情,因为你的程序将无法响应任何事件(即,它似乎被“锁定”或“挂起”),直到处理程序返回。

如果你想按一下按钮让n秒后发生一些事情,那么正确的做法是使用计时器。

它看起来像这样(但请原谅任何错误,我通常不会写Swing代码):

int numMilliseconds = getNext() * 1000;
javax.swing.Timer timer = new javax.swing.Timer(
        numMilliseconds,
        (ActionEvent e) -> makeSomethingHappen(...)
        );
timer.setRepeats(false);
timer.start();