2011-10-17 22 views
6

Estoy tratando de hacer un ThreadPoolExecutor con prioridad. Así defino unPriority ThreadPoolExecutor en Java (Android)

private static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, MAXPOOL, TimeUnit.SECONDS, 
    queue, new mThreadFactory()); 

Así que la clave es la referencia de colas ahora. Pero cuando yo anuncio

static PriorityBlockingQueue<mDownloadThread> queue=new PriorityBlockingQueue<mDownloadThread>(MAXPOOL,new DownloadThreadComparator()); 

El compilador da un error en la primera línea: El constructor ThreadPoolExecutor (int, int, int, TimeUnit, PriorityBlockingQueue, FileAccess.mThreadFactory) no está definido con una sola quickfix: Cambiar el tipo de 'queue' a BlockingQueue. ¿Me puedes ayudar a entender cuál es el problema?

Gracias

Información adicional:

Para comparar los runnables I implementd la clase siguiente

class mDownloadThread implements Runnable{  
    private Runnable mRunnable;  
    private int priority;  
    mDownloadThread(Runnable runnable){ 
     mRunnable=runnable;   
    } 

    @Override 
    public void run() { 
     mRunnable.run();   
    } 

    public int getPriority() { 
     return priority; 
    } 

    public void setPriority(int priority) { 
     this.priority = priority; 
    }  
} 

El comparador:

class DownloadThreadComparator implements Comparator<mDownloadThread>{ 
    @Override 
    public int compare(mDownloadThread arg0, mDownloadThread arg1) { 

    if (arg0==null && arg1==null){ 
     return 0; 
    } else if (arg0==null){ 
     return -1; 
    } else if (arg1==null){ 
     return 1; 
    } 
    return arg0.getPriority()-arg1.getPriority(); 

    } 

} 

Respuesta

6

ThreadPoolExecutor constructor acepta BlockingQueue<Runnable> y no BlockingQueue<? extends Runnable>, por lo tanto no puede pasar a la instancia PriorityBlockingQueue<mDownloadThread>.

Se puede cambiar el tipo de queue a PriorityBlockingQueue<Runnable>, pero en ese caso no será capaz de poner en práctica Comparator<mDownloadThread> sin poner dentro del método compare.

La otra solución es pasar por alto el tipo genérico de comprobación, pero sería su responsabilidad de presentar únicos casos de mDownloadThread a execute método:

static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, 
     MAXPOOL, TimeUnit.SECONDS, (PriorityBlockingQueue) queue, new mThreadFactory()); 
4

El problema es que ThreadPoolExecutor está esperando un BlockingQueue<Runnable> y está de paso a PriorityBlockingQueue<mDownloadThread>. El PriorityBlockingQueue implementa BlockingQueue, por lo que ese no es el problema. El problema es el Runnable. No puede pasar un tipo genérico de mDownloadThread donde se esperaba Runnable.

Fix es el siguiente:

static PriorityBlockingQueue<Runnable> queue=new PriorityBlockingQueue<Runnable>(MAXPOOL,new DownloadThreadComparator()); 

& &

class DownloadThreadComparator implements Comparator<Runnable>{ 

Si ThreadPoolExecutor fueron escritos para aceptar un BlockingQueue<? extends Runnable> lo que tiene funcionaría.

+0

mDownloadThread implementa Runnable también. por lo que no debería ser un problema, ¿verdad? – Addev

+0

No. Al igual que no se puede pasar una 'Lista ' en una 'Lista ' –

+0

Al hacer esto, se pasan instancias de FutureTask al Comparador. Esto es legal porque se extiende desde Runnable. Sin embargo, no puedes obtener los atributos necesarios para una comparación del objeto en cuestión. Dolor real en el trasero – Mike

Cuestiones relacionadas