我正在为我的私人服务器制造人工智能机器人。它们的名称必须是随机且唯一的,因此我创建了一个从网站检索随机字符串的函数。生成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);
}
答案 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中生成它们。 当然,它们不是可读的名称,但是它们应该非常适合您的用例。