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时,测试是可以的。 这是来自文档的

  • 如果线程数小于corePoolSize,则创建一个新线程 线程以运行新任务
  • 如果线程数等于(或大于) corePoolSize,将任务放入队列
  • 如果队列已满,且线程数小于 maxPoolSize,创建一个新线程以在其中运行任务
  • 如果队列已满,且线程数大于或 等于maxPoolSize,拒绝该任务
  • 事实上,当maxSize=4时,可能会引发异常

    第一次调用
    passTask(coreSize,service)
    ,我们得到task1,task2,task3。将创建thread1、thread2和thread3来运行它们

    第二次呼叫
    passTask(核心大小,服务)

  • i=0,我们得到task4,task4将被放入队列中
  • i=1,我们得到任务5

    2.1。如果task4仍在队列中,则将创建thread4并运行task5

    2.2。如果线程1、线程2或线程3已从队列中获取task4,则task5将被放入队列中

  • 当我们得到任务6时,i=2

    3.1。如果task4仍在队列中,则必须有4个活动线程,并且由于队列已满,将引发异常

    3.2。如果task5在队列中,则必须有三个线程处于活动状态,因此将创建thread4并运行task6

    3.3。如果队列为空,task6将被放入队列中

  • 在条件3.1中,可能会引发异常。但在测试中,任务将很快从块队列中取出,因此这种情况几乎不会发生

    p.S.:

    当maxSize=3且queueSize=1时,添加此行

    Thread.sleep(10)

    之后

    for(inti=0;i

    可以使您的代码毫无例外地运行