ThreadPoolExecutorJava
我有一个示例代码ThreadPoolExecutorJava,java,java.util.concurrent,threadpoolexecutor,Java,Java.util.concurrent,Threadpoolexecutor,我有一个示例代码 @Test public void testWithBlockQueue() throws InterruptedException { String poolFormat = "ServiceTaskPool-%d"; int coreSize = 3; int maxSize = 3; int queueSize = 1; int idleThreadLiveInSecond = 35;
@Test
public void testWithBlockQueue() throws InterruptedException {
String poolFormat = "ServiceTaskPool-%d";
int coreSize = 3;
int maxSize = 3;
int queueSize = 1;
int idleThreadLiveInSecond = 35;
ThreadFactory factory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(queueSize);
final ThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize, idleThreadLiveInSecond,
TimeUnit.SECONDS, queue, factory, new ThreadPoolExecutor.AbortPolicy());
service.allowCoreThreadTimeOut(true);
passTask(coreSize, service);
Thread.sleep(5000);
passTask(coreSize, service);
System.out.printf("Thread pool state %s", service);
Thread.sleep(6000);
}
protected void passTask(int coreSize, ThreadPoolExecutor service) {
for (int i=0; i < coreSize; i++) {
service.execute(new Runnable() {
@Override
public void run() {
System.out.printf("Simple printf from %s \n", Thread.currentThread().getName());
}
});
}
}
@测试
public void testWithBlockQueue()引发InterruptedException{
String poolFormat=“ServiceTaskPool-%d”;
int coreSize=3;
int maxSize=3;
int queueSize=1;
int idleThreadLiveInSecond=35;
ThreadFactory工厂=新的ThreadFactory(){
@凌驾
公共线程newThread(可运行的r){
返回新线程(r);
}
};
ArrayBlockingQueue=新的ArrayBlockingQueue(queueSize);
最终ThreadPoolExecutor服务=新的ThreadPoolExecutor(coreSize、maxSize、idleThreadLiveInSecond、,
TimeUnit.SECONDS、队列、工厂、新ThreadPoolExecutor.AbortPolicy());
服务。allowCoreThreadTimeOut(true);
passTask(coreSize、service);
睡眠(5000);
passTask(coreSize、service);
System.out.printf(“线程池状态%s”,服务);
睡眠(6000);
}
受保护的void passTask(int coreSize、ThreadPoolExecutor服务){
对于(int i=0;i
当我设置queueSize 2时,我得到了异常,因为threadpoolexecutor无法将一个任务插入到队列中,当我设置queueSize 3时是ok的。我不明白为什么当我设置maxSize=4时,测试是可以的。
这是来自文档的
passTask(coreSize,service)
,我们得到task1,task2,task3。将创建thread1、thread2和thread3来运行它们
第二次呼叫passTask(核心大小,服务)
:
Thread.sleep(10)代码>
之后
for(inti=0;i
可以使您的代码毫无例外地运行