9

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;
    }

}

次に、タスク:

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);
        } 

    }

}

ボタンにアクションを割り当てます。

executor.execute(new mRunanble(i++));

しかし、私はそのボタンをスパムし、3 番目のスレッドが作成されないため、ThreadPoolExecutor コンストラクター ( maximumPoolSize=4) の 2 番目のパラメーターは何ですか。4 つのスレッドが作成され、そのうちの 2 つが実行終了の 1 分後に強制終了されることを確認していました。

4

3 に答える 3

5

の API からThreadPoolExecutor:

実行中のスレッドが corePoolSize より多く、 maximumPoolSize より少ない場合、新しいスレッドはキューがいっぱいの場合にのみ作成されます。

の容量があるため、キューがいっぱいになることはありません1000。容量を に変更すると、 が作成されている1ことがわかりますThread

このExecutorsクラスはメソッドに aSynchronousQueueを使用しているためnewCachedThreadPool、それも使用することを検討してください。

于 2012-09-02T14:42:33.343 に答える
2

ThreadPoolExecutor maximumPoolSize は、corePoolSize no がタスクを実行するのに十分でなく、すべての no がタスクによって占有されている場合、タスクを実行するためにもう 1 つのスレッドのみが作成される場合に表示されます。この no は maxPoolSize まで大きくなる可能性があります。

maxPoolsize の概念を誤解していたので編集してください。以下のリンクを参照してください

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

于 2012-09-02T14:31:27.843 に答える
1

ThreadPool に新しい追加スレッドを作成させる ( maximumPoolSizeパラメータに従ってプール サイズを拡張する) には、次の簡単な例を実行してみてください。

public class Main {

    public static void main(String[] args) throws InterruptedException {

        ThreadPoolExecutor tpe = new ThreadPoolExecutor(
                1, 2, 500, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1));
        System.out.println("init pool size= " + tpe.getPoolSize() + ", queue size=" + tpe.getQueue().size());

        tpe.execute(new Task("1st", 10000));
        Thread.sleep(1000);
        print(tpe, "1st");

        tpe.execute(new Task("2nd", 0));
        Thread.sleep(1000);
        print(tpe, "2nd");

        tpe.execute(new Task("3d", 2000));
        Thread.sleep(1000);
        print(tpe, "3d");

        while (tpe.getPoolSize()>1) {           
            Thread.sleep(100);
        }
        System.out.println("pool size= " + tpe.getPoolSize() + ", queue size=" + tpe.getQueue().size());
        tpe.shutdown();
    }

    private static void print(ThreadPoolExecutor tpe, String name) {
        System.out.println("After " + name + " execute -  pool size= " + tpe.getPoolSize() + ", queue=" + tpe.getQueue());
    }

    private static class Task implements Runnable {

        private final String name;
        private final long time;

        Task(String name, long time) {
            this.name = name;
            this.time = time;
        }

        @Override
        public void run() {
            System.out.println("Run " + Thread.currentThread().getName() + "-" + name);
            try {
                Thread.sleep(time);
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
            System.out.println("Finish " + Thread.currentThread().getName() + "-" + name);
        }

        @Override
        public String toString() {
            return name;
        }

    }
}

maximumPoolSizekeepAliveTimeの影響を示す出力が得られます。

init pool size= 0, queue size=0
Run pool-1-thread-1-1st
After 1st execute -  pool size= 1, queue=[]
After 2nd execute -  pool size= 1, queue=[2nd]
Run pool-1-thread-2-3d
After 3d execute -  pool size= 2, queue=[2nd]
Finish pool-1-thread-2-3d
Run pool-1-thread-2-2nd
Finish pool-1-thread-2-2nd
pool size= 1, queue size=0
Finish pool-1-thread-1-1st
于 2016-07-27T14:29:11.490 に答える