我必须实施一个课程,用于存储学校项目的机场信息。该课程应该从我们的教师为我们提供的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”
答案 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();
}