0

何千ものトランザクションを処理するモジュールがあります。各トランザクションには、通過する複数のフェーズがあります。このモジュールは、マルチスレッド モードで実行されます。作成できるスレッド数の制限 (ハードコーディング) を定義しました (サーバーの使用率に応じて制限されます)。

ここで、スレッドが一定期間 (24 時間以上) 待機する必要がある状況に遭遇しました。スレッドの数が限られているため、すべてのスレッドが 24 時間以上待機している場合、これはアプリケーションを完全にブロックしています。

ここで必要なのは、待機中のスレッドを 24 時間再利用する方法です。スレッドが待機モードになっている場合は、そのスレッドを別のトランザクションに再利用する必要があり、元の待機が終了したら、保留されていた場所から元のトランザクションを再開します。

上記の説明が問題を理解するのに役立つことを願っています。

4

1 に答える 1

0

システムに長い遅延がある場合は、スレッドを増やすのが最善の方法です。同時に実行されるスレッドの数を制限したい場合は、許可を使用できます。たとえば、ブロッキング操作があると解放され、ブロッキングが終了すると再取得されるセマフォなどです。これにより、一度に実行できるスレッドの数が制限されますが、多くのタスクを簡単に切り替えることができます。

public abstract class LimitedTask implements Runnable {
    static final Semaphore PERMITS = new Semaphore(Runtime.getRuntime().availableProcessors());

    @Override
    public final void run() {
        try {
            PERMITS.acquire();
        } catch (InterruptedException e) {
            System.err.println("Task " + getClass() + " cancelled before it was started.");
            return;
        }
        try {
            runTask();
        } finally {
            PERMITS.release();
        }
    }

    protected abstract void runTask();

    protected void runBlockingTask(Runnable runnable) {
        PERMITS.release();
        try {
            runnable.run();
        } finally {
            PERMITS.acquireUninterruptibly();
        }
    }
}

この例では、これらを必要な数だけ持つことができますが、PERMITエリア内に入るのは限られた数だけです。タスクはrunBlockingTask()を呼び出してブロッキングタスクを実行できるようにすることもできますが、ブロッキング中に別のスレッドを実行できるようにします。

于 2013-01-31T10:14:42.563 に答える