Threads的一些问题

时间:2012-02-23 22:46:00

标签: java

我在java中的线程遇到了一些麻烦。基本上我创建一个线程数组并启动它们。该计划的目的是模拟比赛,总计每个参赛者(即每个线程)的时间并挑选获胜者。

竞争对手移动一个空格,等待(即线程在5到6秒之间的随机时间段内休眠),然后继续。线程没有按照预期的顺序完成。

现在出现问题。我可以得到一个线程完成所需的总时间;我想要的是将所有时间从线程存储到一个数组中,并能够计算最快的时间。

为此,我应该将数组放在main.class文件中吗?我是否正确地假设,因为如果它被放置在Thread类中它将无法工作。或者我应该创建第三类?

我很困惑:/

2 个答案:

答案 0 :(得分:4)

可以在调用线程的方法中声明它,只需注意几点:

  • 每个线程都应该知道它在数组中的索引。也许你应该在构造函数中传递它
  • 然后你有三个填充数组的选项
    • 数组应为final,以便可以在匿名类中使用
    • 数组可以传递给每个线程
    • 线程应该在侦听器完成时通知它,这反过来会增加一个数组。
  • 考虑使用Java 1.5 Executors framework提交Runnables,而不是直接使用线程。

答案 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;
    }
}