在 Java 中优化线程调用

Optimizing thread calls in Java

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);
  }
}

是:了解 循环 ,更重要的是,不要使用原始线程,尤其是这么多线程。

相反,创建一个单个 执行程序服务实例(由众所周知的 有意义的 线程数支持)并将任务推送到该服务中.

其他的都像 "year 2000 style"。难以控制,难以测试,难以维护,...

最后:了解 "adding many threads" 不是答案,而是伪装的问题。当性能(吞吐量、延迟等)对您来说真的很重要时,您将不得不仔细衡量实际情况,然后专注于优化 true 瓶颈。

你最好使用 for-loopExecutors 来更好地控制和创建线程池:

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

使用循环和 ExecutorService

ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < count; i++) {
    executor.execute(new TokenStarter());
}

这应该会重新创建您的代码,但不是最优的。您可能想限制同时 运行 的线程数量:

ExecutorService executor = Executors.newFixedThreadPool(desiredParallelism);