Java中线程调用的优化

Java中线程调用的优化,java,java-threads,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(n

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);
  }
}
是:了解循环,更重要的是,不要使用原始线程,尤其是这么多线程

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

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


最后:了解“添加多个线程”并不是一个答案,而是一个伪装的问题。当性能(吞吐量、延迟等)对您来说非常重要时,您必须仔细衡量实际情况,然后集中精力优化真正的瓶颈。

您最好使用
for循环
执行器
,后者更适合控制和创建线程池:

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 exe=Executors.newFixedThreadPool(4);
对于(int i=0;i<200;i++){
提交(新的TokenStarter());
}
exe.shutdown();
exe.waittermination(Long.MAX_值,时间单位纳秒);//如果需要等待

使用循环和执行器服务

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

首先:如果你需要添加Lorem ipsum,这样你的问题甚至可以邮寄,你肯定应该重新考虑这是否是一个好问题。第二:你听说过循环吗?第三:这段代码应该做什么?它应该做什么?@GhostCat不想把它带入元领域太远,我认为它有一个边界,从欢迎和帮助到试图从无用的东西中拯救出有用的东西,以避免不受欢迎。@AlexRitchie不,这违反了堆栈溢出的策略。如果您的目标是将令牌流写入单个输出文件,则只有在令牌生成过程非常昂贵的情况下,线程才有帮助。否则,写入文件将成为单线程瓶颈。只处理
可调用项
。由于op将他的类传递给一个新线程,它可能实现了
Runnable
接口,您应该在示例中使用
exe.execute(new-TokenStarter())
。否则这就是一个完美的例子。@L.Spillner可能有;)哎呀,我的坏蛋没看见。回忆起一位同事告诉我使用execute for
Runnable
s并提交for
Callable
s。
ExecutorService executor = Executors.newFixedThreadPool(desiredParallelism);