java - 用于生成名称的多线程

标签 java multithreading performance

我正在为我的私有(private)服务器制作人工智能机器人。它们的名称必须是随机且唯一的,因此我创建了一个从网站检索随机字符串的函数。生成 3 个名称并将它们添加到数组列表需要一秒钟的时间。这意味着 10 分钟内我会得到 1800 个随机生成的字符串。

这有点糟糕,因为我需要在尽可能短的时间内生成大量名称,因此我创建了多个线程,可以在不到一分钟的时间内生成这 1800 个名称。但我不确定这是否是一个好的做法。

public static void init() {
    for (int i = 0; i < 600; i++) {
        new Thread("" + i) {
            public void run() {
                for (int j = 0; j < 3; j++) {
                    names.add(NameGenerator.generateRandomName(Utils.random(3, 12)));
                }
            }
        }.start();
    }
}

我认为这不是有效的,也不是最佳实践。

编辑:(添加功能)

public static ArrayList<String> names = new ArrayList<String>();

public static String generateRandomName(int length) {
    String result;
    try {
        result = postURL("https://jimpix.co.uk/generators/word-generator.asp#result",
                "go=yes&ul1=0&chars=" + length + "&match=1&numwords=1&alpha=0&lk=", 30000);
    } catch (IOException e) {
        Logger.logObject("Failed generating a new name");
        return null;
    }
    result = result.substring(result.indexOf("check-username.asp?u=") + "check-username.asp?u=".length(),
            result.indexOf("\"><span style=\"color:white;"));
    return capitalizeFirstLetter(result);
}

最佳答案

我认为这不是使用线程的正确方法。线程用于处理诸如分别运行 GUI 和应用程序逻辑之类的事情,这样 GUI 就不会卡住。它们还用于运行单独的服务器和客户端线程。您实际上不会从本示例中的线程中受益。另外,如果不使用执行器,您将因为大量线程而耗尽内存(600 个是可以的,但应该避免和限制)。仅使用一个线程,以免阻塞主程序或根本不使用线程。

理论上,多核处理器的性能实际上会提高,但这取决于多种因素。

将您的代码更改为如下所示:

public static void init() {
   new Thread(new Runnable() {
      public void run() {
         for (int i = 0; i < 600 * 3; i++) {
              names.add(NameGenerator.generateName());  
         }
     }
   }).start();
}

此外,使用此示例时,请记住,线程是异步的,因此还提供某种回调函数,以便在重要时让您的程序注意到。

也使用同步收集。

关于java - 用于生成名称的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263126/

相关文章:

Python 作用域和线程问题

python - 从目录树中获取任意文件

java - jsp中无法连接mysql数据库

java - java中多线程的概念

c - 意外的 pthread 函数输出

javascript - 有没有办法让 Collection 在 MeteorJS 上分块发布数据?

java - Android Web View CPU 使用率

java - 计算 ArrayList 中一行中相同值的数量

java - 如何将字节数组转换为 ZIP 文件并使用 Java 下载?

java - 在分层平面java中添加绘图