0

同じブロッキングキューを共有する2つのthreadPoolインスタンスがあるシナリオがあります。これがコードです

<bean id="TaskQueue" class="java.util.concurrent.LinkedBlockingQueue">
        <constructor-arg type="int">
            <value>1000</value>
        </constructor-arg>
    </bean>

    <bean id="TaskThreadPool1" class="java.util.concurrent.ThreadPoolExecutor">
        <constructor-arg type="int">
            <value>10</value>
        </constructor-arg>
        <constructor-arg type="int">
            <value>50</value>
        </constructor-arg>
        <constructor-arg type="long">
            <value>5</value>
        </constructor-arg>
        <constructor-arg>
            <value>SECONDS</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="TaskQueue" />
        </constructor-arg>
    </bean>


    <bean id="TaskThreadPool2" class="java.util.concurrent.ThreadPoolExecutor">
        <constructor-arg type="int">
            <value>1</value>
        </constructor-arg>
        <constructor-arg type="int">
            <value>1</value>
        </constructor-arg>
        <constructor-arg type="long">
            <value>5</value>
        </constructor-arg>
        <constructor-arg>
            <value>SECONDS</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="TaskQueue" />
        </constructor-arg>
    </bean>

ここで、TaskThreadPool2.execute(task)を介してTaskThreadPool2で5つを超えるタスクを送信すると、どのように動作するかという質問があります。

TaskThreadPool1も、同じキューをリッスンしているこれらのタスクbcozの実行を開始する必要があると私は感じています。

4

2 に答える 2

0

同じブロッキング キューに対して 2 つのスレッド プールを使用する理由が本当に考えられません。見つける最良の方法は、プログラムを作成して実行することです。

そのようなプールを 2 つ持つ必要はないと言ったので、プールのサイズを 2 倍に増やします。

また、2 つのプールが必要な場合は、両方のプールの 1 つのスレッドがキュー内の同じリソースにアクセスしようとするシナリオが存在する可能性があるため、同時実行性を確認してください。これにより、予期しない結果が生じる可能性があります。

于 2012-11-19T05:28:48.230 に答える
0

いいえ、TaskThreadPool1 はキューからタスクを実行しません。ThreadPoolExecutor コンストラクター (ソース) を参照してください - 作業キューのリッスンを開始しません。簡単にテストできます:

    BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>();
    Runnable r = new Runnable() {
        public void run() {
            System.out.println("running");
        }
    };
    q.add(r);
    q.add(r);
    ThreadPoolExecutor ex1 = new ThreadPoolExecutor(10, 50, 5, TimeUnit.SECONDS, q);

実行しても何も起こらず、ex1 はキュー内のタスクを無視します。しかし、これを追加

    ex1.execute(r);

そして、あなたは見るでしょう

    running
    running
    running

executor は execute() でアクティブ化されました。

于 2012-11-19T05:57:40.990 に答える