Ну, я не думаю, чтобы избежать состояния гонки (как упоминалось в ваших комментариях), это могло бы помочь в любом случае. Todo:
Если Thread N3 действительно больше не не существует, ThreadPoolExecutor не должны создавать новый поток с "ид" 3. Если поток занят, эта задача не должна быть выполнена до резьбы будет FRE
ThreadPoolExecutor
Управление потоками для вас. Чтобы сделать это, невозможно сделать это с существующей библиотекой, вам, вероятно, придется создать свой собственный, чтобы сделать это. Если ваша логика и безопасность потоков зависит от RID
, чем я довольно рекомендуем использовать Карту RID и ReentrantLock, somethign так:
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
к желаемым и синхронизировать соответственно.
IMHO, использующий thread-id пула потоков для синхронизации, является очень плохой идеей. Жизнь много раз может быть намного проще.
Какова цель этого? Я не вижу никого. Могут быть много случаев, что если N 3 занят, или он больше не существует и т. Д. – Jatin
В двух словах: цель состоит в том, чтобы избежать состояния гонки и выполнить MyRunnables с одинаковыми идентификаторами RID, чтобы они были отправлены ThreadPoolExecutor. –
О случаях, описанных выше: Если Thread N3 больше не существует, ThreadPoolExecutor должен создать новый поток с «id» 3. Если поток занят, эта задача не должна выполняться до тех пор, пока поток не станет бесплатным. –