-1

ExecutorService固定スレッドプール シナリオでアイドル スレッドをシャットダウンするように指示する方法はありますか?

よろしく!

::編集:わかりました、イライラしています。次のコンストラクターを使用して、keepAliveTime を指定できる ThreadPoolExecutor に切り替えました。

private final LinkedBlockingQueue<Runnable> threadPool = new LinkedBlockingQueue<Runnable>()
public Crawler(String startingUrl, int numThreads, int depth) {

    System.setProperty("http.agent", "");
    // System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "info");
    this.url = startingUrl;
    this.maxDepth = depth;

    executorService = new ThreadPoolExecutor(
            numThreads, 
            numThreads, 
            2000, 
            TimeUnit.MILLISECONDS, 
            threadPool,
            new ThreadPoolExecutor.CallerRunsPolicy());


    databaseHandler = new DatabaseHandler();
    try {
        databaseHandler.init();
    } catch (final SQLException e) {
        e.printStackTrace();
    }
}

// this method is invoked by each Runnable when it found new links
@Override
public void queueLink(String link, int currentDepth) throws Exception {
    if (currentDepth < maxDepth) {
        final LinkFinder lf = new LinkFinder(link, currentDepth, this);
        executorService.execute(lf);

    } else {
        System.out.println("max depth reached!");
        System.out.println("num queued tasks: " + threadPool.size());
    }
}

新しい Runnable はそれぞれ、現在の深度プロパティを受け取ります。各 Runnable の最後の行で currentDepth を 1 増やします。もちろん、期待どおりに「最大深度に達しました」と「キューに入れられたタスクの数: 0」が出力されます。ただし、スレッドは何時間も実行され続けます。

私は、パラメーター keepAliveTime と TimeUnit.MILLISECONDS が、2 秒間のアイドル状態の後、スレッドがシャットダウンされることを保証するという印象の下で操作していました (他のタスクがキューに入れられていない場合)。

私は何が欠けていますか?つまり、else ステートメントを実行してエグゼキュータを手動でシャットダウンする回数を数えることはできますが、ThreadPoolExecutor はすでに時間ベースの動作を提供しているので、それに固執したいと思います。

今のところ、私が設定したポリシーと関係があると思います...それを調べます。とにかく、ありがとう

よろしく!

4

1 に答える 1

0

setKeepAliveTime(long time, TimeUnit unit)

また

次の方法で、スレッド プールのサイズを動的に減らすことができます。 setCorePoolSize(int corePoolSize)

于 2013-10-30T14:22:14.403 に答える