ThreadPoolExecutor的maximumPoolSize如何工作?

Add*_*dev 7 java multithreading android

我正在尝试理解ThreadPoolExecutor类.我已经阅读了这个答案和Javadoc.但是我的实验与那个描述不符:

我用工厂初始化线程池来跟踪id

int tcounter = 0;
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES,
        new ArrayBlockingQueue<Runnable>(1000), new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                return new mThread(tcounter++, r);
            }
        });

public class mThread extends Thread {
    int id;

    private mThread(int id, Runnable run) {
        super(run);
        GLog.e("created thread " + id);
        this.id = id;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后任务:

public class mRunanble implements Runnable {
    int value = 0;

    private mRunanble(int value) {
        super();
        this.value = value;
    }

    @Override
    public void run() {
        SystemClock.sleep(3000);
        Thread t = Thread.currentThread();
        if (t instanceof mThread) {

            GLog.e("Say " + (value) + " on thread " + ((mThread) t).id);
        } 

    }

}
Run Code Online (Sandbox Code Playgroud)

并为动作指定一个按钮:

executor.execute(new mRunanble(i++));
Run Code Online (Sandbox Code Playgroud)

但我垃圾邮件那个按钮并且永远不会创建第三个线程,所以ThreadPoolExecutor构造函数(maximumPoolSize=4)中的第二个参数是什么.我正在编写4个线程来创建,其中2个在执行结束1分钟后被杀死

Jef*_*rey 5

来自API ThreadPoolExecutor:

如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程.

您的队列永远不会填充,因为它的容量为1000.如果您将容量更改为1,您将看到Thread正在创建.

Executors类使用SynchronousQueue它的newCachedThreadPool方法,所以你可能要考虑使用它.


ami*_*ngh 2

在 ThreadPoolExecutor 中,当 corePoolSize no 不足以执行您的任务时,maximumPoolSize 就会出现,并且如果所有 no 都被任务占用,则只会再创建一个线程来执行任务。此 no 可以增长到 maxPoolSize。

编辑您误解了 maxPoolsize 概念。请参阅下面的链接。

http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-threadpoolexecutor-pool-size

  • +1 ,以这个例子为例。起始线程池大小为 1,核心池大小为 5,最大池大小为 10,队列为 100。Sun 的方式:当请求进入时,将创建最多 5 个线程,然后将任务添加到队列中,直到达到100. 当队列已满时,将创建新线程,最多可达 maxPoolSize。一旦所有线程都在使用并且队列已满,任务将被拒绝。随着队列的减少,活动线程的数量也会减少。 (3认同)