run方法有效但线程不会调用它

时间:2014-12-11 03:57:13

标签: java

我必须实施一个课程,用于存储学校项目的机场信息。该课程应该从我们的教师为我们提供的HTML网站中读取有关航班和乘客信息的数据,为此,我们使用线程。我的问题是,当我在我的线程上调用start()方法时,它不会调用我的类上实现runnable的run方法,这很奇怪,因为当我第一次测试程序并直接调用run()方法时,它运作得很好。这是while循环,它位于我的worker类的run方法中,用于进行实际的数据处理。

while (1 == 1) {
    temp = scan.next();
    if ((temp.equals("</body>")))
        break;
    else {
        name = temp;
        flightNum = scan.nextInt();
        city = scan.next();
        indexOfBR = city.indexOf("<");
        city = city.substring(0, indexOfBR);

        synchronized (airplanes) {
            addFlight(flightNum, city);
            addPassengerReservation(flightNum, name);
        }
    }
}
scan.close();

该循环应该读取乘客姓名,然后是航班号,然后是目的地城市,存储在html文件中:

"passenger name" "flight Number" "destination city"<br>

创建和运行线程的方法是

public void readFlightData(String[] urls) {
    for (int x = 0; x < urls.length; x++) {
        if (!(urls[x].equals(""))) {
            try {
                Worker w = new Worker(new URL(urls[x]));
                Thread work = new Thread(w);
                work.start();
            }
            catch (MalformedURLException e) {
                //do nothing
            }
        }
    }
}

当我在工作线程上调用start并且我不知道为什么时,此方法不会调用run方法。任何帮助将不胜感激

我已将问题确定为在while循环中的synchronized块中。传递给同步块飞机的对象是一个ArrayList,用于保存机场级航班和乘客的信息。 addFlight()方法用于添加包含flightNum和目标城市的航班。 addPassengerReservation将乘客添加到指定的flightNum,名称为“name”

2 个答案:

答案 0 :(得分:1)

代码非常脆弱。我建议进行以下更改。我认为有一个MalformedURLException并且你正在隐藏它。

public void readFlightData(String[] urls) {
    for (int x = 0; x < urls.length; x++) {
        if (!(urls[x].equals(""))) {
            try {
                Worker w = new Worker(new URL(urls[x]));
                Thread work = new Thread(w);
                work.start();
            }
            catch (MalformedURLException e) {
                System.err.print(e);
            }
        }
    }
}

答案 1 :(得分:0)

我明白了。我的问题是我在运行我创建的线程并下载必要信息之前在我的Airport类上调用方法。我不得不在所有线程上调用join()来解决这个问题。对于那些古玩的人来说,这是工作代码:

ArrayList<Thread> threads = new ArrayList<Thread>();
int x;

for (x = 0; x < urls.length; x++) {
    if (!(urls[x].equals(""))) {
        try {
            Worker w = new Worker(new URL(urls[x]));
            Thread work = new Thread(w);
            work.start();
            threads.add(work);
        }
        catch (MalformedURLException e) {
            System.err.print(e);
        }
    }
}

for (x = 0; x < threads.size(); x++)
    try {
        threads.get(x).join();
    } catch (InterruptedException e) {
        e.printStackTrace();
}