在 JAVA 中的循环内每 x 秒执行一次具有不同参数的方法
Executing a method every x seconds with different parameters inside a loop in JAVA
如何运行在一个循环中周期性地使用不同参数的方法?
Iteration 1 : obj.process(index1)
wait 5 seconds...
Iteration 2: obj.process(index2)
wait 5 seconds...
Iteration 3: obj.process(index3)
wait 5 seconds...
and so on...
具体来说,我的目标是重复运行一个方法,下一次迭代需要等待X秒,下一次迭代也需要等待X秒等等。
我的示例代码,它是错误的,几乎同时启动所有 obj.process(index):
Timer time = new Timer();
for (final String index : indeces) {
int counter = 0;
time.schedule(new TimerTask() {
@Override
public void run() {
indexMap.put(index, obj.process(index));
}
}, delay);
counter++;
if (counter > indeces.size())
System.exit(0);
}
对所有对象使用单个 Timer
。使 run
方法处理单个对象。如果有更多对象要处理,让 run
方法重新安排 TimerTask
(即 this
)。
有了这样的解决方案,你不需要循环,只需要设置一次定时器。
这似乎对我有用:
public class TestClass {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
String [] indeces = new String[] {"one", "two", "three"};
long delay = 0;
Timer time = new Timer();
for (final String index : indeces) {
int counter = 0;
System.out.println("index-->" + delay);
time.schedule(new TimerTask() {
Map indexMap = new HashMap();
@Override
public void run() {
indexMap.put(index, index);
System.out.println("index-->" + index);
}
}, delay);
counter++;
delay = delay + 5000; // Increase delay by 5 secs
if (counter > indeces.length)
System.exit(0);
}
}
基本上我为每个定时器任务增加了 5 秒的延迟
如果您的代码 运行 在它自己的线程中,以下最小示例可能会有用:
public static void main(String[] args) {
Object[][] parameters ={ new String[]{"HELLO", "WORLD"},
new Integer[]{1,2,3},
new Double[]{0.1, 0.9, 5.3}
};
for (int i = 0; i < parameters.length; i++) {
try {
TimeUnit.SECONDS.sleep(1);
doSomething(parameters[i]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static void doSomething(Object[] objects) {
System.out.println(Arrays.toString(objects));
}
在Java8中,可能的解决方案是:
public static void main(String[] args) {
Object[][] parameters ={ new String[]{"HELLO", "WORLD"},
new Integer[]{1,2,3},
new Double[]{0.1, 0.9, 5.3}
};
Arrays.stream(parameters).forEachOrdered(p -> doSomething(p));
}
private static void doSomething(Object[] objects) {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Arrays.toString(objects));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如何运行在一个循环中周期性地使用不同参数的方法?
Iteration 1 : obj.process(index1)
wait 5 seconds...
Iteration 2: obj.process(index2)
wait 5 seconds...
Iteration 3: obj.process(index3)
wait 5 seconds...
and so on...
具体来说,我的目标是重复运行一个方法,下一次迭代需要等待X秒,下一次迭代也需要等待X秒等等。
我的示例代码,它是错误的,几乎同时启动所有 obj.process(index):
Timer time = new Timer();
for (final String index : indeces) {
int counter = 0;
time.schedule(new TimerTask() {
@Override
public void run() {
indexMap.put(index, obj.process(index));
}
}, delay);
counter++;
if (counter > indeces.size())
System.exit(0);
}
对所有对象使用单个 Timer
。使 run
方法处理单个对象。如果有更多对象要处理,让 run
方法重新安排 TimerTask
(即 this
)。
有了这样的解决方案,你不需要循环,只需要设置一次定时器。
这似乎对我有用:
public class TestClass {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
String [] indeces = new String[] {"one", "two", "three"};
long delay = 0;
Timer time = new Timer();
for (final String index : indeces) {
int counter = 0;
System.out.println("index-->" + delay);
time.schedule(new TimerTask() {
Map indexMap = new HashMap();
@Override
public void run() {
indexMap.put(index, index);
System.out.println("index-->" + index);
}
}, delay);
counter++;
delay = delay + 5000; // Increase delay by 5 secs
if (counter > indeces.length)
System.exit(0);
}
}
基本上我为每个定时器任务增加了 5 秒的延迟
如果您的代码 运行 在它自己的线程中,以下最小示例可能会有用:
public static void main(String[] args) {
Object[][] parameters ={ new String[]{"HELLO", "WORLD"},
new Integer[]{1,2,3},
new Double[]{0.1, 0.9, 5.3}
};
for (int i = 0; i < parameters.length; i++) {
try {
TimeUnit.SECONDS.sleep(1);
doSomething(parameters[i]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static void doSomething(Object[] objects) {
System.out.println(Arrays.toString(objects));
}
在Java8中,可能的解决方案是:
public static void main(String[] args) {
Object[][] parameters ={ new String[]{"HELLO", "WORLD"},
new Integer[]{1,2,3},
new Double[]{0.1, 0.9, 5.3}
};
Arrays.stream(parameters).forEachOrdered(p -> doSomething(p));
}
private static void doSomething(Object[] objects) {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Arrays.toString(objects));
} catch (InterruptedException e) {
e.printStackTrace();
}
}