Nel mio progetto sto costruendo un framework di esecuzione Java che riceve richieste di lavoro da un client. Il lavoro (di dimensioni variabili) è suddiviso in un insieme di attività e quindi accodato per l'elaborazione. Esistono code separate per elaborare ogni tipo di attività e ogni coda è associata a un ThreadPool. ThreadPools è configurato in modo tale che le prestazioni generali del motore siano ottimali.Lavoro/Task Stealing ThreadPoolExecutor
Questo progetto ci aiuta a bilanciare il carico delle richieste in modo efficace e le richieste di grandi dimensioni non finiscono per eseguire il hogging delle risorse di sistema. Tuttavia, a volte la soluzione diventa inefficace quando alcune delle code sono vuote e il rispettivo pool di thread rimane inattivo.
Per migliorarlo, stavo pensando di implementare una tecnica di furto di lavoro/attività in modo che la coda pesantemente caricata possa ottenere aiuto dagli altri ThreadPools. Tuttavia, ciò potrebbe richiedere l'implementazione del mio Executor poiché Java non consente l'associazione di più code a un ThreadPool e non supporta il concetto di furto del lavoro.
Leggi di Fork/Join ma non mi sembra adatto per le mie esigenze. Qualsiasi suggerimento o modo alternativo per costruire questa soluzione potrebbe essere molto utile.
Grazie Andy
Si dovrebbe pensare a come mantenere tutte le CPU occupate. Non importa se alcuni dei tuoi thread sono inattivi se stai facendo il miglior uso delle tue CPU. –
Se i pool di thread hanno tanti thread quanti sono i cpus, qualsiasi singolo pool di thread può "rubare" tutte le cpus anche se tutti gli altri pool di thread sono inattivi. –
@PeterLawrey - è vero, ma se ci sono molti pool, allora si può avere scarso rendimento se tutti i thread in tutti i pool funzionano allo stesso tempo. – jtahlborn