1

Runnable を実装するクラスがあります

public class MyRunnable implements Runnable {
    private long RID = <SOME_LONG_ID_VALUE>;
    public long getRID() { return this.RID; }
    public void run {
        System.out.println("HAI!");
    }
}

ThreadPoolExecutorフィールド内でタスクを「ルーティング」する方法はありRIDますか (つまり、スレッド N 3 が Runnable withRID = 1で実行される場合、次の tast はRID = 1スレッド N 3 によって実行される必要があります (生きている場合))。

4

3 に答える 3

0

競合状態を回避することは考えていません(コメントで述べたように)、それは何らかの形で役立つと思います。トド:

スレッド N3 が存在しない場合、ThreadPoolExecutor は「id」3 の新しいスレッドを作成する必要があります。スレッドがビジー状態の場合、スレッドが解放されるまでこのタスクを実行してはなりません。

ThreadPoolExecutorスレッド管理を行います。上記を行うには、既存のライブラリでは不可能です。おそらく、独自のライブラリを作成する必要があります。ロジックとスレッド セーフが に依存しているRID場合は、次のような RID と ReentrantLock のマップを使用することをお勧めします。

ConcurrentHashMap<Long, ReentrantLock> map = new ConcurrentHashMap<Long, ReentrantLock>();

public synchornized ReentrantLock getLock(Long id){
    ReentrantLock lock = map.get(id);
    if(lock!=null)
       return lock;
    else{
       map.put(id, new ReentrantLock());
 }

Runnableで、目的の を取得し、それにlock応じて同期できます。

同期にスレッドプールのスレッドIDを使用するIMHOは、非常に悪い考えです。人生は何度も簡単になります。

于 2013-07-23T13:45:57.210 に答える