TokenGenerator.main()(在底部调用)用于生成10个字符的字母数字标记,并将它们写入文本文件。我想尝试尽可能多地生产这些产品。
我想知道是否有更好的方法:
package Random;
public class TokenStarter implements Runnable {
public static void main(String[] args) {
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
new Thread(new TokenStarter()).start();
}
@Override
public void run() {
TokenGenerator.main(null);
}
}
答案 0 :(得分:2)
是的:了解循环,更重要的是,不要使用原始线程,特别是这么多。
相反,创建一个单个执行程序服务实例(由众所周知且有意义的线程数支持)并将任务推送到该服务中。
其他任何东西都像“2000年风格”。难以控制,难以测试,难以维护......
最后:了解到只是“添加许多线程”不是答案,而是伪装的问题。当性能(吞吐量,延迟......)对您来说真的很重要时,您将不得不仔细测量实际情况,然后专注于优化真正的瓶颈。
答案 1 :(得分:1)
您最好使用for-loop
和Executors
,这样可以更好地控制和创建线程池:
ExecutorService exe = Executors.newFixedThreadPool(4);
for (int i = 0; i < 200; i++) {
exe.submit(new TokenStarter());
}
exe.shutdown();
exe.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // if need to wait
答案 2 :(得分:1)
使用循环和ExecutorService
。
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < count; i++) {
executor.execute(new TokenStarter());
}
这应该重新创建您的代码,但不是最佳的。您可能希望限制并发运行的线程数量:
ExecutorService executor = Executors.newFixedThreadPool(desiredParallelism);