我在java中的线程遇到了一些麻烦。基本上我创建一个线程数组并启动它们。该计划的目的是模拟比赛,总计每个参赛者(即每个线程)的时间并挑选获胜者。
竞争对手移动一个空格,等待(即线程在5到6秒之间的随机时间段内休眠),然后继续。线程没有按照预期的顺序完成。
现在出现问题。我可以得到一个线程完成所需的总时间;我想要的是将所有时间从线程存储到一个数组中,并能够计算最快的时间。
为此,我应该将数组放在main.class文件中吗?我是否正确地假设,因为如果它被放置在Thread类中它将无法工作。或者我应该创建第三类?
我很困惑:/
答案 0 :(得分:4)
可以在调用线程的方法中声明它,只需注意几点:
final
,以便可以在匿名类中使用答案 1 :(得分:2)
编辑:以下解决方案假设您在所有竞争对手完成比赛后仅需时间。
您可以使用如下所示的结构(在主类中)。通常你想添加很多你自己的东西;这是主要概要。
请注意,并发性在这里根本不是问题,因为一旦线程完成运行,您就会从MyRunnable
实例中获取值。
请注意,对于每个竞争对手使用单独的线程可能不一定是修改后的方法,但这将是一个不同的问题。
public static void main(String[] args) {
MyRunnable[] runnables = new MyRunnable[NUM_THREADS];
Thread[] threads = new Thread[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
runnables[i] = new MyRunnable();
threads[i] = new Thread(runnables[i]);
}
// start threads
for (Thread thread : threads) {
thread.start();
}
// wait for threads
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
// ignored
}
}
// get the times you calculated for each thread
for (int i = 0; i < NUM_THREADS; i++) {
int timeSpent = runnables[i].getTimeSpent();
// do something with the time spent
}
}
static class MyRunnable implements Runnable {
private int timeSpent;
public MyRunnable(...) {
// initialize
}
public void run() {
// whatever the thread should do
// finally set the time
timeSpent = ...;
}
public int getTimeSpent() {
return timeSpent;
}
}