1

マルチスレッド手法を使用してデータベースを更新するために使用されているオブジェクトがあります。

今、更新の試行でデータベース接続を圧倒してクラッシュさせたくありません。また、特定の数のスレッドが稼働している場合に待機したいと考えています。

implements Runnableと呼ばれる私のクラスupdateUnmarked

今、スレッド数が次の場合にのみ新しいスレッドを立ち上げたい< X

Thread.getAllStackTraces().keySet().size()動作していないようで、次の方法でも解決しないようです。

public static int getLiveThreads(){
    ThreadMXBean bean = null;
    bean = ManagementFactory.getThreadMXBean();

    return bean.getThreadCount();
}

両方とも 8 つしか返されません...しかし、私は間違いなく 8 つ以上のスレッドを持っています。

これを行う方法はありますか?

ありがとう!!!

4

2 に答える 2

2

現在、スレッド数が < X の場合にのみ新しいスレッドを立ち上げたい

あなたが必要としているのは、スレッドプールエグゼキュータだと私には思えます。データベースへの更新は、実行のためにプールに送信できます。また、プールに割り当てられるスレッドの数を制限することで、データベースへの同時要求の数を制限できます。

// create a thread pool with a max of 4 concurrent threads
ExecutorService threadPool = Executors.newFixedThreadPool(4);

// submit your database operation to the thread-pool
threadPool.submit(new DatabaseUpdateJob(databaseConnection, updateStatement));

...
public class DatabaseUpdateJob implements Runnable {
    // you can construct your jobs and pass in context for them if necessary
    public DatabaseUpdateJob(Connection dbConnection, String statement) {
        ...
    }
    public void run() {
        // use the connection here to update the database
    }
}

本当に自分でやりたいのなら、Thread.activeCount()間違いなくうまくいくはずです。現在のスレッド グループ内のアクティブなスレッドの数を返します。データベースの作業を開始する前に、スレッド数のスナップショットを作成する必要があります。バックグラウンドで実行され、無視すべきさまざまなタスクを実行するシステム スレッドが多数あります。その後、新しいカウントを取得するたびに、バックグラウンド スレッドを差し引いて、データベース スレッドのみを追跡できます。

しかし、スレッドプールは常に良い考えです。

于 2013-02-09T20:23:42.090 に答える
0

ここでスプリングのスレッドプール実行サービスを使用する方がクリーンだと思います

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
     <property name="corePoolSize" value="5" />
     <property name="maxPoolSize" value="10" />
     <property name="queueCapacity" value="25" />
</bean>
于 2013-02-09T20:33:22.673 に答える