スレッドをオーバースピンするときに問題を解決できるExecutors.newCachedThreadPool()
を使用することをお勧めしました。エグゼキュータを使用してもスレッドを開始できません
スレッドの数が一定のポイントを超えて増加しても、まだエラーがあります。システムリソースが利用可能になるのを待っている間にスレッドが待機するのを許可する方法はありますか?
[WARN ] Thread table can't grow past 16383 threads.
[ERROR][thread ] Could not start thread pool-1-thread-16114. errorcode -1
Exception in thread "Main Thread" java.lang.Error: errorcode -1
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657)
at sg.java.executors_helloworld.App.main(App.java:15)
public class App {
public static void main(String args[]) {
ExecutorService es = Executors.newCachedThreadPool();
long time = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
es.execute(new Car());
}
long completedIn = System.currentTimeMillis() - time;
System.out.println(DurationFormatUtils.formatDuration(completedIn,
"HH:mm:ss:SS"));
}
}
public class Car implements Runnable {
public void run() {
System.out.println("Car <" + Thread.currentThread().getName()
+ "> doing something");
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
各スレッドはスタック領域を使用して、あなたはスタック領域が不足したときに、あなたがより多くのスレッドを作成することはできません。キャッシュされたプールはすべてのタスク用のスレッドを作成しますが、CPUを使用しない、つまりすべての時間を費やすタスクがたくさんある場合を除いて、スレッド数をいくつかのコア数。例えば4,8,16。 –