我用例:如何创建一个ThreadPoolExecutor,根据需要创建线程并在适用时将其过期?
- 设置最小大小“N”对于这意味着“N”螺纹总是执行人启动后的可用线程池。
- 设置线程池的最大大小'M'。
- 当所有'M'线程忙时,传入任务应该排队。
- 基于空闲状态超时期满(M-N)线程。
我相信HttpClient后面的池管理器可能有类似的设置。我试图用ThreadPoolExecutor来实现它,但无法找到一种方法。可能吗?
这是一个测试的例子。
public class ExecutorExample {
public static void main(String[] args) throws InterruptedException {
int minPoolSize = 2;
int maxPoolSize = 10;
int ttlMillis = 100;
ThreadPoolExecutor startupExecutor = new ThreadPoolExecutor(minPoolSize,
maxPoolSize, // surprisingly this is not obeyed.
ttlMillis,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize());
startupExecutor.execute(new MyRunnable(i));
}
for (int i = 0; i < 20; i++) {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize());
}
}
}
class MyRunnable implements Runnable {
int n;
public MyRunnable(int n) {
this.n = n;
}
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + ":" + n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
'ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue)'是否符合您的需求? –
@RomanPuchkovskiy你想到哪个队列对象?我会测试。 – phani
这是一个奇怪的要求......为什么在传入任务排队之前,需要将线程数从N增加到M *? –