我正在为我的私有(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/