Я смотрел класс ThreadPoolExecutor
, и я обнаружил, что он позволяет указать максимальный размер пула и размер основного пула.Каковы основные потоки в ThreadPoolExecutor?
Я понимаю, немного, о том, когда изменить основные и максимальный размер пула на основе ответа здесь: When is specifying separate core and maximum pool sizes in ThreadPoolExecutor a good idea?
Однако, я хотел бы знать, каковы эти «основные темы». Я всегда получаю 0, когда я использую метод getCorePoolSize()
из ThreadPoolExecutor
SSCCE здесь:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class PoolSize {
public static void main(String[] args) {
// Create a cached thread pool
ExecutorService cachedPool = Executors.newCachedThreadPool();
// Cast the object to its class type
ThreadPoolExecutor pool = (ThreadPoolExecutor) cachedPool;
// Create a Callable object of anonymous class
Callable<String> aCallable = new Callable<String>(){
String result = "Callable done !";
@Override
public String call() throws Exception {
// Print a value
System.out.println("Callable at work !");
// Sleep for 5 sec
Thread.sleep(0);
return result;
}
};
// Create a Runnable object of anonymous class
Runnable aRunnable = new Runnable(){
@Override
public void run() {
try {
// Print a value
System.out.println("Runnable at work !");
// Sleep for 5 sec
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// Submit the two tasks for execution
Future<String> callableFuture = cachedPool.submit(aCallable);
Future<?> runnableFuture = cachedPool.submit(aRunnable);
System.out.println("Core threads: " + pool.getCorePoolSize());
System.out.println("Largest number of simultaneous executions: "
+ pool.getLargestPoolSize());
System.out.println("Maximum number of allowed threads: "
+ pool.getMaximumPoolSize());
System.out.println("Current threads in the pool: "
+ pool.getPoolSize());
System.out.println("Currently executing threads: "
+ pool.getTaskCount());
pool.shutdown(); // shut down
}
}
ОК, поэтому, если в «кэшированном пуле потоков» я меняю количество основных потоков, схожих с «фиксированным пулом потоков», эти ребята всегда будут там. Тем не менее, нити, не используемые более минуты, будут отброшены. Чистый результат объединяет преимущества как кэшированного, так и фиксированного пула потоков. Правильно ? –
Вы создаете пул, в котором есть несколько потоков, которые всегда находятся в режиме ожидания, и при необходимости создаются другие потоки. Неработающие потоки не будут потреблять память, поскольку ресурсы, которые они берут, будут освобождены. –