Java run方法起作用,但线程赢了';别这么说
我必须为一个学校项目实现一个存储机场信息的类。这个课程应该从我们的讲师提供给我们的HTML格式的网站上读取航班和乘客信息的数据,为了做到这一点,我们使用了线程。我的问题是,当我在线程上调用start()方法时,它不会在实现runnable的类上调用run方法,这很奇怪,因为当我第一次测试程序并直接调用run()方法时,它工作得很好。这是执行实际数据处理的worker类的run方法中的while循环Java run方法起作用,但线程赢了';别这么说,java,Java,我必须为一个学校项目实现一个存储机场信息的类。这个课程应该从我们的讲师提供给我们的HTML格式的网站上读取航班和乘客信息的数据,为了做到这一点,我们使用了线程。我的问题是,当我在线程上调用start()方法时,它不会在实现runnable的类上调用run方法,这很奇怪,因为当我第一次测试程序并直接调用run()方法时,它工作得很好。这是执行实际数据处理的worker类的run方法中的while循环 while (1 == 1) { temp = scan.next(); if (
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();
while(1==1){
temp=scan.next();
如果((温度等于(“”))
打破
否则{
名称=温度;
flightNum=scan.nextInt();
city=scan.next();
indexOfBR=city.indexOf(“代码非常脆弱。我建议进行以下更改。我认为存在格式错误的异常,您正在隐藏它
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);
}
}
}
}
public void readFlightData(字符串[]URL){
对于(int x=0;x
我找到了答案。我的问题是,在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();
}
ArrayList threads=new ArrayList();
int x;
对于(x=0;x
行work=new Thread(w);
是否实际运行?也许您应该记录MalformedURLException
,以便您知道它发生了。我返回并执行了该操作。线程正在运行。或者至少,代码没有抛出MalformedURLException。此外,当我通过直接调用w.run运行代码时()它成功了,我现在使用的URL与我当时使用的URL相同,只是为了说明,尽管while(1==1)
您也可以编写while(true)
直接创建无限循环。我刚刚在工作中调用了isAlive,线程实际上是活动的。这是实际类工作中的编码问题吗?我很困惑,听起来你需要开始使用调试器。我做了这些更改,代码没有抛出错误,但是,它仍然不起作用。在开始时到底发生了什么方法调用线程实例化所用对象的run方法之前?可能是这导致了问题。您可以尝试为一个url运行一个线程而不是多个url吗?这将类似于您的单个执行。这就是我现在测试它的方式。url[]只有一个元素仅用于测试您是否可以注释掉run方法中的所有代码,并放入一个简单的System.out语句,看看它是否有效?另一件事是注释掉syncrhonised块,看看worksI是否添加了System.out语句,并发现while循环中的synchronized块中存在问题。它得到到同步块,但由于某些原因,该块中的方法调用不会修改当前对象。祝贺您自己解决了此问题。但是,连接与运行()有何关系
未被调用?顺便说一句。您应该通过在线程上重新设置InterruptedException标志或抛出InterruptedException来修复InterruptedException的处理"描述了处理中断异常的策略,甚至在这篇博客文章中,事实证明线程实际上是在调用run,但是,我在测试中没有意识到这一点,因为我调用的Junit测试在我创建的线程下载完所有必要的信息之前就已经完成了昨天我遇到了很多困扰我的错误。通过在创建线程的方法中调用join,我有效地阻止了该方法的结束,并停止了Junit测试的运行,直到所有线程都完成了信息的下载。
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);
}
}
}
}
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();
}