多线程生成名称

时间:2018-09-10 17:57:44

标签: java multithreading performance

我正在为我的私人服务器制造人工智能机器人。它们的名称必须是随机且唯一的,因此我创建了一个从网站检索随机字符串的函数。生成3个名称并将它们添加到arraylist需要一秒钟。这意味着在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);
}

3 个答案:

答案 0 :(得分:2)

我认为这不是使用线程的正确方法。线程用于处理诸如分别运行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();
}

另外,在此示例中,请记住,线程是异步的,因此还提供某种回调函数以使程序在需要时引起注意。

也使用同步收集。

答案 1 :(得分:0)

在同时修改列表时,您必须为列表使用同步结构。
作为更有效的选择,您可以创建一个实现Runnable的类,并在其中声明一个List字段,其中包含生成的单词。实例化该类的3个实例,将它们作为Thread启动并合并其List结果。
您可以从客户端使用CountDownLatch,启动的线程将“ countDown”。这将简化执行合并的同步步骤。

答案 2 :(得分:0)

如果要生成唯一的随机字符串,则可以使用UUIDs。它们是以下格式的随机生成的唯一字符串:aeb1f910-1340-4f9d-829b-c9e179b21b4e。

您可以使用UUID.randomUUID()方法在Java中生成它们。 当然,它们不是可读的名称,但是它们应该非常适合您的用例。