我有一个按钮,点击它会导致线程休眠x个时间。
我希望线程能够从数组中获取时间。
这是应该发生的事情:
我到目前为止的代码是:
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);
}
}
答案 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的最后一个赋值将是数组的最后一个元素。
请务必检查(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();