java - 为什么启动我的线程不调用 run() 方法?

标签 java multithreading

<分区>

在第一种方法中,我只想为数组中的每个 URL 创建一个线程并解析它:

    public void readFriendData(String[] urls) {
    Thread[] urlThreads = new Thread[urls.length];
    for (int x = 0; x < urls.length; x++) {
        Runobject input = new Runobject(urls[x], this);
        Thread one = new Thread(input);
        urlThreads[x] = one;

    }

    for(int x = 0; x< urls.length; x++){
        urlThreads[x].start();
    }
}

然后我为我的可运行对象创建了一个单独的类,其中 run 方法创建一个 bufferedReader 来扫描 html 文件并解析它。

package twitbook;
public class Runobject implements Runnable {
public String address;
public Twitbook net;

public Runobject(String theAdress, Twitbook net) {
    address = theAdress;
    this.net = net;

}

@Override
public void run() {
    try {
        URL url = new URL(address);
        URLConnection urlConnection = url.openConnection();

        BufferedReader scanner = new BufferedReader(new InputStreamReader(
                urlConnection.getInputStream()));

        String input = scanner.readLine();
        while (!input.equals("</body>")) {
            if (input.startsWith("<tr> <td>addperson</td>")) {
                input.replaceAll("<tr> <td>addperson</td>", "");
                input.replaceAll(" <td>", "");
                input.replaceAll("</td> </tr>", "");

                net.addUser(input);
            } else if (input.startsWith("<tr> <td>addfriend</td>")) {
                String[] bits = new String[2];
                input.replaceAll("<tr> <td>addfriend</td>", "");
                bits = input.split("</td> <td>");
                input.replaceAll(" <td>", "");
                input.replaceAll("</td> </tr>", "");

                net.friend(bits[0], bits[1]);
                net.friend(bits[1], bits[0]);

            }

            input = scanner.readLine();

        }
        scanner.close();

    } catch (IOException e) {
        System.out.println("bad URL");
    }
    }

}

我知道第一个方法何时被调用,即使我启动了线程,它也没有通过 runObject 类中的 run 方法。为什么是这样?

最佳答案

您的代码完美运行。你根本没有意识到这一点。添加一些日志记录/输出消息,您将看到它。哦,对了,期待输入结束。这是简化的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Runobject implements Runnable {
    public String address;

    public static void main(String a[]) {
        System.out.println("Start");
        readFriendData(new String[] { "http://google.com", "http://yahoo.com" });
        System.out.println("End");
    }

    public static void readFriendData(String[] urls) {
        Thread[] urlThreads = new Thread[urls.length];
        for (int x = 0; x < urls.length; x++) {
            Runobject input = new Runobject(urls[x]);
            Thread one = new Thread(input);
            urlThreads[x] = one;

        }

        for (int x = 0; x < urls.length; x++) {
            urlThreads[x].start();
        }
    }

    public Runobject(String theAdress) {
        address = theAdress;
        System.out.println(address);
    }

    @Override
    public void run() {
        try {
            URL url = new URL(address);
            URLConnection urlConnection = url.openConnection();

            BufferedReader scanner = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));

            int countOfLines = 0;
            String input = scanner.readLine();
            while (input != null && !input.equals("</body>")) {
                countOfLines++;
                if (input.startsWith("<tr> <td>addperson</td>")) {
                    input.replaceAll("<tr> <td>addperson</td>", "");
                    input.replaceAll(" <td>", "");
                    input.replaceAll("</td> </tr>", "");

                    // net.addUser(input);
                } else if (input.startsWith("<tr> <td>addfriend</td>")) {
                    String[] bits = new String[2];
                    input.replaceAll("<tr> <td>addfriend</td>", "");
                    bits = input.split("</td> <td>");
                    input.replaceAll(" <td>", "");
                    input.replaceAll("</td> </tr>", "");

                    // net.friend(bits[0], bits[1]);
                    // net.friend(bits[1], bits[0]);

                }

                input = scanner.readLine();

            }
            scanner.close();
            System.out.println(address + " has " + countOfLines + " lines");
        } catch (IOException e) {
            System.out.println("bad URL");
        }
    }    
}

这里是输出:

Start
http://google.com
http://yahoo.com
End
http://google.com has 8 lines
http://yahoo.com has 63 lines

请注意,当您的读者刚刚开始时,您的主线程已经完成。一个词——多线程。

关于java - 为什么启动我的线程不调用 run() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203240/

相关文章:

c# - 在新线程中启动表单并在它们之间引发事件

java泛型方法基础

java - 将数据从 Microsoft SQL Server 移动到 Clouer Hadoop 的 Web 应用程序

java - 使用 ThreadLocal 为每个线程分配 ID

.net - Thread.abort永远挂起

c# - Interlocked.Read/Exchange for longs on 64-bit architectures

java - 通过 FCM onMessageReceived 方法从 RemoteMessage 获取值

java - 将长数分解为质因数

multithreading - Lua - 如何模拟 "multithreading"?

c++ - 多线程成员函数c++