用Java优化线程调用

时间:2018-05-09 12:18:40

标签: java java-threads

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

3 个答案:

答案 0 :(得分:2)

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

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

其他任何东西都像“2000年风格”。难以控制,难以测试,难以维护......

最后:了解到只是“添加许多线程”不是答案,而是伪装的问题。当性能(吞吐量,延迟......)对您来说真的很重要时,您将不得不仔细测量实际情况,然后专注于优化真正的瓶颈。

答案 1 :(得分:1)

您最好使用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

答案 2 :(得分:1)

使用循环和ExecutorService

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

这应该重新创建您的代码,但不是最佳的。您可能希望限制并发运行的线程数量:

ExecutorService executor = Executors.newFixedThreadPool(desiredParallelism);