为了账号安全,请及时绑定邮箱和手机立即绑定

用于生成名称的多线程

用于生成名称的多线程

繁星淼淼 2021-09-12 16:42:58
我正在为我的私人服务器制作人工智能机器人。他们的名字必须是随机且唯一的,所以我做了一个从网站中检索随机字符串的函数。生成 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);}
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

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

}

另外,使用这个例子,记住,线程是异步的,所以也提供某种回调函数来让你的程序注意到它是否重要。


也使用同步集合。


查看完整回答
反对 回复 2021-09-12
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2021-09-12
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

当您同时修改 List 时,您将不得不为您的 List 使用同步结构。
作为更有效的替代方法,您可以创建一个实现类Runnable并在其中声明一个List包含生成词的字段。实例化该类的 3 个实例,将它们作为 Thread 启动并合并它们的List结果。
您可以CountDownLatch从客户端使用启动的线程将“倒计时”。它将简化执行合并的同步步骤。

查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信